Catch That Cow (BFS)

来源:互联网 发布:微信js sdk 编辑:程序博客网 时间:2024/06/05 21:08

抓住那头牛!!!
在一条数轴上有一个农民和他的一头牛,cow奶牛;农民要抓住牛,现在农民有三种移动方式:
1.x->x+1耗时一分钟;
2.x->x-1耗时一分钟;
3.第三种比较吊了,瞬移,x->2x耗时一分钟;
以上x代表农民所在坐标;
问:农民至少需要多长时间能抓住牛?
这个问题用广搜比较好,深搜会超时,那什么是广搜?
广搜就是一层层扩展,对于所到达的每个位置计算出下一步能到达的所有位置,一层层扩展,直到找到目标;
用数组模拟队列储存每一步到达的坐标和所需步数,这就用到了结构体;
下面直接上代码:

#include <stdio.h>#include <stdlib.h>#include <string.h>struct node{       //定义一个结构体,包含该点的坐标,和到达该点的步数(分钟);    int x;    int step;}q[100005],temp;int head=0, tail=1;  // 定义队列的头和尾;int book[100005];    //用来标记该点是否走过;int main(){    int N, K;        //N是农民所在位置,K是cow所在位置;    scanf("%d%d",&N,&K);    q[head].x=N;    q[head].step=0;  //先把起点放入队列;    book[N]=1;       //标记起点;    int i;    while(head<tail) //到队列为空时循环结束,当然该题一定会抓到cow,所以不会空;    {        if(q[head].x==K)  //如果第一步就到达K,直接循环结束;           break;        int i, tx, s, flag=0;        for(i=1; i<=3; i++)  //下一步直接到达的有三种情况;        {            if(i==1)        //第一种情况;                tx=q[head].x+1;            else if(i==2)   //第二种情况;                tx=q[head].x-1;            else            //第三种情况;                tx=q[head].x*2;            if(!book[tx] && tx>=0 && tx<=100000) //if  该点没有走过,并且不越界,放入队列;            {                book[tx]=1;    //标记;                q[tail].x=tx;                q[tail].step=q[head].step+1;                tail++;            }            if(tx==K)           //if 到达该点停止;            {                flag=1;                break;            }        }        if(flag)       //if   flag==1,说明已经找到cow,循环停止;            break;        head++;         //队首出队,再扩展下一个;    }    printf("%d\n",q[tail-1].step);  //队尾一直保持空,所以输出前一个;    return 0;}


原创粉丝点击