题意:给出初始点和目的地的位置。
有两种交通方式:步行和远程传送。
步行:可以在一分钟内从任何点X移动到X-1或X + 1点
传送:可以在一分钟内从任何点X移动到点2×X。
问最少几分钟到达目的地
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
#define maxn 100000
int n,k;
bool vis[maxn*2+2];
int num[maxn*2+2];
void bfs()
{
queue<int >q;
q.push(n);
vis[n]=1;
while(!q.empty())
{
int p=q.front();
q.pop();
if(p==k)//如果相等就输出
{
printf("%d\n",num[k]);
return;
}
int x=p+1;
if(x<=k&&!vis[x])//向前走一步 但不能超过了k还继续往前走 无意义
{
vis[x]=1;
num[x]=num[p]+1;
q.push(x);
}
x=p-1;
if(x>=0&&!vis[x])//向后退一步 不能退到0以后
{
vis[x]=1;
num[x]=num[p]+1;
q.push(x);
}
x=2*p;
if(p<k&&!vis[x])//步数乘2 如果超过了k还乘2 无意义
{
vis[x]=1;
num[x]=num[p]+1;
q.push(x);
}
}
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
memset(vis,0,sizeof vis);
memset(num,0,sizeof num);
bfs();
}
return 0;
}