题意:农夫的牛跑了,给出农夫和牛在坐标轴上的位置n和k,农夫每次只能从点n移动到n-1、n+1或者n*2的位置。输出抓到牛所需要的最小移动次数。
思路:思路明显的bfs,每次搜索只按照这三种方式,标记访问过的点防止重复访问即可。
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long LL;
typedef pair<int,int> P;
const int N=1000000+5;
int g[N],n,k;
int bfs(){
if(n==k)return 0;
queue<int> q;
q.push(n);
while(q.size()){
int p=q.front();
q.pop();
if(p-1>=0&&p-1<=1000000&&g[p-1]==-1){
g[p-1]=g[p]+1;
if(p-1==k)return g[p-1];
q.push(p-1);
}
if(p+1>=0&&p+1<=1000000&&g[p+1]==-1){
g[p+1]=g[p]+1;
if(p+1==k)return g[p+1];
q.push(p+1);
}
if(p*2>=0&&p*2<=1000000&&g[p*2]==-1){
g[p*2]=g[p]+1;
if(p*2==k)return g[p*2];
q.push(p*2);
}
}
}
int main(){
while(~scanf("%d%d",&n,&k)){
memset(g,-1,sizeof(g));
g[n]=0;
printf("%d\n",bfs());
}
}