题目大意:在一个坐标轴上。有一个农夫准备追牛。可以向前,向后,也可以坐标加倍。求最少几步可以追上牛。
思路:求最短时间,应该使用bfs,使用sign标记这个点是否走过。bfs有三个方向,最后输出步数即可
#include<stdio.h>
#include<string.h>
struct node
{
int s;
int stage;
}queue[100005];//队列
int sign[100005];
int check(int k){//判断这个点能否走
if(k>=0&&k<=100000&&!sign[k])
return 1;
return 0;
}
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
memset(sign,0,sizeof(sign));//初始化
int head=0,tail=1;
struct node r;
sign[n]=1;
queue[head].s=n;
queue[head].stage=0;//起点
// printf("%d %d\n",tail,head);
while(head<tail)
{
r=queue[head];
int temp;
temp=r.s+1; //前进一步
if(check(temp))
{
queue[tail].stage=r.stage+1;
queue[tail].s=temp;
sign[temp]=1;
if(queue[tail].s==k)//判断是否到达终点
break;
tail++;
// printf("%d %d\n",tail,head);
}
temp=r.s-1;//后退一步
if(check(temp))
{
queue[tail].stage=r.stage+1;
queue[tail].s=temp;
sign[temp]=1;
if(queue[tail].s==k)
break;
tail++;
}
temp=r.s*2;//步数×2
if(check(temp))
{
queue[tail].stage=r.stage+1;
queue[tail].s=temp;
sign[temp]=1;
if(queue[tail].s==k)
break;
tail++;
}
head++;
}
int i;
//for(i=0;i<10;i++)
printf("%d\n",queue[tail].stage);//输出最短步数
}
return 0;
}