有三种移动方式,作为BFS搜索的方向
利用 当 n > k 时只能向后走,优化结果
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = 100005;
int n, k;
bool vis[maxn];
struct node {
int n, step;
};
int check(node h){
if(h.n < 0 || h.n > 100001) return 0;
else if(vis[h.n]) return 0;
return 1;
}
int bfs(){
node now, next;
queue<node> Q;
now.n = n;
now.step = 0;
Q.push(now);
while(!Q.empty()){
now = Q.front();
Q.pop();
if(now.n == k) { return now.step; }
next = now;
for(int i = 1; i <= 3; i++){
if(i == 1) next.n = now.n + 1;
else if(i == 2) next.n = now.n - 1;
else if(i == 3) next.n = now.n * 2;
if(check(next)) {
next.step = now.step + 1;
vis[next.n] = 1;
Q.push(next);
}
}
}
return 0;
}
int main(){
while(scanf("%d%d", &n, &k) == 2){
memset(vis, 0, sizeof(vis));
if(n > k) {
cout << n-k << endl;
}
else {
int ans = bfs();
cout << ans << endl;
}
}
return 0;
}