-
Notifications
You must be signed in to change notification settings - Fork 0
/
two_buttons.cpp
69 lines (55 loc) · 1.16 KB
/
two_buttons.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
#include <iostream>
#include <queue>
using namespace std;
#define MAX 20000
typedef struct{
long long int val;
long long int nivel;
}Nodo;
struct compare
{
bool operator()(Nodo l, Nodo r)
{
return l.val > r.val;
}
};
long long int M, N;
long long int pasos;
Nodo actual, tmp;
bool visitados[MAX + 2];
priority_queue<Nodo, vector<Nodo>, compare> cola;
int main() {
cin >> M >> N;
Nodo _nnodo;
//Creamos la raiz a partir del numero M
_nnodo.val = M;
_nnodo.nivel = 0;
cola.push(_nnodo);
while(cola.top().val != N){
actual = cola.top();
cola.pop();
if(actual.val - 1 == N || actual.val * 2 == N){
break;
} else {
if(actual.val - 1 > 0){
if(!visitados[actual.val -1 ]){
visitados[actual.val - 1] = true;
tmp.val = actual.val - 1;
tmp.nivel = actual.nivel + 1;
cola.push(tmp);
}
}
if(actual.val * 2 <= MAX){
if(!visitados[actual.val * 2]){
visitados[actual.val * 2] = true;
tmp.val = actual.val * 2;
tmp.nivel = actual.nivel + 1;
cola.push(tmp);
}
}
//cout << actual.val -1 << ' ' << actual.val * 2 << endl;
}
}
cout << actual.nivel + 1;
return 0;
}