广度优先搜索例题
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上
,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)
。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要
花多少时间才能抓住牛?
本题是一个典型的bfs案例,虽然说用dfs也能得到答案,但是bfs是更好的方法,在这里我们贴下代码
#include <iostream>
using namespace std;
const int M=100000+5;
struct note
{
int x;int step;
};
int vis[M];
int main()
{
ios::sync_with_stdio(false);
int startx,targetx,head=0,tail=0;
cin>>startx>>targetx;
if(startx==targetx)
{
cout<<0<<'\n';
return 0;
}
struct note q[M];
q[tail].x=startx;q[tail].step=0;vis[q[tail].x]=1;
tail++;
while(tail>=head)
{
if(vis[q[head].x+1]==0 && q[head].x+1<M)
{
vis[q[head].x+1]=1;q[tail].x=q[head].x+1;
q[tail].step=q[head].step+1;
if(q[tail].x==targetx)
{
cout<<q[tail].step<<'\n';
break;
}
tail++;
}
if(vis[q[head].x-1]==0 && q[head].x-1>=0)
{
vis[q[head].x-1]=1;q[tail].x=q[head].x-1;
q[tail].step=q[head].step+1;
if(q[tail].x==targetx)
{
cout<<q[tail].step<<'\n';
break;
}
tail++;
}
if(vis[q[head].x*2]==0 && q[head].x*2<M)
{
vis[(q[head].x)*2]=1;q[tail].x=(q[head].x)*2;
q[tail].step=q[head].step+1;
if(q[tail].x == targetx)
{
cout<<q[tail].step<<'\n';
break;
}
tail++;
}
head++;
}
return 0;
}