题意:已知农夫 FJ 及牛的位置,若FJ站在x处,则他可以用一分钟,向前一步到达x+1或向后一步到达x-1
也可以用一分钟到达2*x处,问FJ至少要花多久才能到牛的位置
分析:每一次用三种选择,向前一步或后一步或跳到2*x处,用bfs
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int a[100010];
int bfs(int n,int k)
{
queue<int> q;
int i;
q.push(n);
a[n]=1;
while(!q.empty()){
i=q.front();
q.pop();
if(i==k)
break;
if(i-1>=0&&!a[i-1]){
q.push(i-1);
a[i-1]=a[i]+1;
}
if(i+1<=100000&&!a[i+1]){
q.push(i+1);
a[i+1]=a[i]+1;
}
if(i*2<=100000&&!a[i*2]){
q.push(i*2);
a[i*2]=a[i]+1;
}
}
return a[k]-1;
}
int main()
{
int s,n,k;
while(scanf("%d%d",&n,&k)!=EOF){
memset(a,0,sizeof(a));
if(n>=k)
s=n-k;
else
s=bfs(n,k);
printf("%d\n",s);
}
return 0;
}