版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhuxiyulu/article/details/77989345
/*
bfs
*/
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int maxn=1e5+5;
int n,k;
bool vis[maxn];
int step[maxn];
bool check(int x)
{
if(x<0||x>maxn)
return 0;
else if(vis[x])
return 0;
return 1;
}
int bfs()
{
int work,next;
queue<int>qu;
qu.push(n);
step[n]=0;
vis[n]=1;
while(!qu.empty())
{
work=qu.front();
qu.pop();
if(work==k)
return step[work];
for(int i=0;i<3;i++)//枚举3种移动方式
{
if(i==0) next=work-1;
else if(i==1) next=work+1;
else next=work*2;
if(check(next))//移动是否合法
{
qu.push(next);
step[next]=step[work]+1;
vis[next]=1;
}
}
}
return 0;
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
memset(vis,0,sizeof(vis));
memset(step,0,sizeof(step));
if(n>=k)//只能以X-1的方式移动
{
printf("%d\n",n-k);
}
else
{
printf("%d\n",bfs());
}
}
return 0;
}