1 广度优先搜索(BFS)
bool visited[MAXN];
void BFS(Graph G, int v) {
visit(v);
visited[v] = TRUE;
Enqueue(Q, v);
while (!isEmpty(Q)) {
DeQueue(Q, v);
for (w = FirstNeighbor(G, v); W >= 0; W = NextNeighbor(G, v, w)) {
if (!visited[w]) {
visit(w);
visited[w] = TRUE;
EnQueue(Q, w);
}
}
}
}
void BFSTraverse(Graph G) {
for (i = 0; i < G.vexnum; i++)
visited[i] = false;
InitQueue(Q);
for (i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
BFS(G, i);
}
}
}
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN = 100001;
bool visit[MAXN];
struct Status {
int position;
int time;
Status(int n, int t): position(n), time(t) {}
};
int BFS(int n, int k) {
queue<Status> myQueue;
visit[n] = true;
myQueue.push(Status(n, 0));
while (!myQueue.empty()) {
Status current = myQueue.front();
myQueue.pop();
if (current.position == k) {
return current.time;
}
for (int i = 0; i < 3; i++) {
Status next(current.position, current.time + 1);
if (i == 0) {
next.position += 1;
} else if (i == 1) {
next.position -= 1;
} else {
next.position *= 2;
}
if (next.position < 0 || next.position >= MAXN || visit[next.position]) {
continue;
}
visit[next.position] = true;
myQueue.push(next);
}
}
}
int main() {
int n, k;
while (cin >> n >> k) {
memset(visit, false, sizeof(visit));
cout << BFS(n, k) << endl;
}
return 0;
}