catch that cow(简单bFS)抓牛 POJ

来源:互联网 发布:深圳市金软网络骗局 编辑:程序博客网 时间:2024/06/05 20:50

题目大意:在一个坐标轴上。有一个农夫准备追牛。可以向前,向后,也可以坐标加倍。求最少几步可以追上牛。

思路:求最短时间,应该使用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;}


0 0
原创粉丝点击