在一个数轴上,给你一个起始点和终点,问你从起点走到终点最少需要多少步.你可以单步走也可以double跳跃.
其中单步走指你当前位置在x上,那么你下一步可以走到x+1或x-1位置上。
double跳跃指,你当前位置在x上,那么你下一步可以走到2*x位置上。
代码:
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
queue<int> Q;
int dis[100005];
int n,k;
int bfs()
{
Q.push(n);
memset(dis,-1,sizeof(dis));
dis[n]=0;
while(!Q.empty())
{
int x=Q.front();
Q.pop();
for(int i=0;i<3;i++)
{
int nx;
if(i==0)nx=x+1;
else if(i==1)nx=x-1;
else nx=2*x;
if(nx>=0&&nx<=100000&&(dis[nx]==-1||dis[nx]>dis[x]+1))
{
dis[nx]=dis[x]+1;
if(nx==k)return dis[nx];
Q.push(nx);
}
}
}
return -1;
}
int main()
{
cin>>n>>k;
if(n>=k)
{
cout<<n-k;
}
else
{
cout<<bfs();
}
}