注意x等于0的时候就不要减一了,同样x*2大于10W也不行
#include <iostream>
#include <cstdio>
#include <memory.h>
#include <queue>
using namespace std;
const int maxn=100010;
bool vis[maxn];
int x,k;
struct state
{
int x,t;
state(int xx=0,int tt=0):x(xx),t(tt){}
};
int bfs(int s){
queue<state>q;
q.push(state(s,0));
vis[s]=1;
while (q.size())
{
state t=q.front();
q.pop();
if(t.x==k)return t.t;
int nx=t.x+1;
if(t.x<k&&!vis[nx]){//如果当前x比k大 那没有必要加1
vis[nx]=1;
q.push(state(nx,t.t+1));
}
nx=t.x-1;
if(nx>=0&&!vis[nx]){//边界
vis[nx]=1;
q.push(state(nx,t.t+1));
}
if(t.x<k&&t.x*2<maxn&&!vis[t.x*2]){//如果当前x比k大,没必要乘2
vis[t.x*2]=1;
q.push(state(t.x*2,t.t+1));
}
}
}
int main(){
while (scanf("%d%d",&x,&k)==2)
{
memset(vis,0,maxn);
printf("%d\n",bfs(x));
}
return 0;
}