典型的宽搜入门题。
注意边界条件。
#include <cstdio>
#include <queue>
#include <utility>
using namespace std;
const int MAX_N = 100000;
typedef pair<int, int> P;
queue<P> q;
bool vis[MAX_N+1];
int Bfs(int n, int k)
{
bool find_ans = false;
q.push(P(n, 0));
P cur;
while (!q.empty()) {
cur = q.front();
q.pop();
if (cur.first == k) {
find_ans = true;
break;
}
if (cur.first + 1 >= 0 && cur.first + 1 <= MAX_N && vis[cur.first+1] == false) {
q.push(P(cur.first+1, cur.second+1));
vis[cur.first+1] = true;
}
if (cur.first - 1 >= 0 && cur.first - 1 <= MAX_N && vis[cur.first-1] == false) {
q.push(P(cur.first-1, cur.second+1));
vis[cur.first-1] = true;
}
if (cur.first * 2 >= 0 && cur.first * 2 <= MAX_N && vis[cur.first*2] == false) {
q.push(P(cur.first*2, cur.second+1));
vis[cur.first*2] = true;
}
}
if (find_ans) {
return cur.second;
}
else
return -1;
}
int main()
{
int n, k;
scanf("%d%d", &n, &k);
printf("%d\n", Bfs(n, k));
return 0;
}