题目意思
现在一个农夫丢了牛,农夫在n的位置,牛在k的位置。现在农夫有三种行动方式,可以从x走到x+1或者走到x-1,或者走到2*x的地方。现在问你农夫最少走几步能够追到他的牛(假设牛在k处不移动)。
解题思路
我们就用一般 的广搜去搜农夫能走的三种状态,选出步数最少的输出即可。
代码部分
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <queue>
using namespace std;
const int maxn=100001;
int step[maxn];
int vis[maxn];
int n,k;
queue<int>Q;
int bfs(int n,int k)
{
int p,q;
step[n]=0;
vis[n]=1;
Q.push(n);
while(!Q.empty())
{
p=Q.front();
Q.pop();
for(int i=0; i<3; i++)
{
if(i==0)
q=p-1;
else if(i==1)
q=p+1;
else
q=p*2;
if(q<0||q>=maxn)
continue;
if(!vis[q])
{
Q.push(q);
vis[q]=1;
step[q]=step[p]+1;
}
if(q==k)
return step[q];
}
}
}
int main()
{
while(cin>>n>>k)
{
memset(vis,0,sizeof(vis));
memset(step,0,sizeof(step));
while(!Q.empty())
Q.pop();
if(n>=k)///如果牛的位置在前,那么农夫只能一次往前走一步能够用最短的时间追到牛
printf("%d\n",n-k);
else
printf("%d\n",bfs(n,k));
}
return 0;
}