-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuri1910_ajude_clotilde.cpp
93 lines (74 loc) · 2.31 KB
/
uri1910_ajude_clotilde.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
* Universidade de Brasília
* Departamento de Ciência da Computação
* CIC0169 - Programação Competitiva
* Prof. Dr. Vinicius R. P. Borges
*
* Tópico: Busca completa, busca em largura
* Aula: resolução do problema Ajude Clotilde (https://www.urionlinejudge.com.br/judge/pt/problems/view/1910)
*
* POR FAVOR: nao submeta esse código-fonte no URI!
*
* Compilar no terminal: g++ uri1910_ajude_clotilde.cpp -std=c++11 -o clotilde
* Executar: ./clotilde
*/
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
int buscaLargura(int origem, int destino,vector<bool> passado)
{
int canal_atual,cliques;
queue<pii> q;
q.push(make_pair(origem,0));
passado[origem] = true;
while(!q.empty())
{
tie(canal_atual,cliques) = q.front();
q.pop();
if(canal_atual == destino)
return cliques;
if(canal_atual%2 == 0 && passado[canal_atual/2]==false)
{
passado[canal_atual/2] = true;
q.push(make_pair(canal_atual/2,cliques+1));
}
if(canal_atual+1 <= 100000 && passado[canal_atual+1] == false)
{
passado[canal_atual+1] = true;
q.push(make_pair(canal_atual+1,cliques+1));
}
if(canal_atual*2 <= 100000 && passado[canal_atual*2] == false)
{
passado[canal_atual*2] = true;
q.push(make_pair(canal_atual*2,cliques+1));
}
if(canal_atual*3 <= 100000 && passado[canal_atual*3] == false)
{
passado[canal_atual*3] = true;
q.push(make_pair(canal_atual*3,cliques+1));
}
if(canal_atual-1 > 0 && passado[canal_atual-1] == false)
{
passado[canal_atual-1] = true;
q.push(make_pair(canal_atual-1,cliques+1));
}
}
return -1;
}
int main()
{
int origem, destino, k,aux,ans;
scanf("%d %d %d",&origem,&destino,&k);
while(origem || destino || k)
{
vector<bool> flag(100001,false);
for(int i = 0; i < k; i++)
{
scanf("%d",&aux);
flag[aux] = true;
}
printf("%d\n",buscaLargura(origem,destino,flag));
scanf("%d %d %d",&origem,&destino,&k);
}
return 0;
}