Catch That Cow (BFS)

本文介绍了一个有趣的广搜算法应用实例——一位农民如何利用三种移动方式最快地抓住逃跑的牛。通过广搜算法,我们能够有效地规划出农民的行动路径,确保在最短的时间内完成任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

抓住那头牛!!!
在一条数轴上有一个农民和他的一头牛,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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值