POJ 3278抓住那头牛

这是一个关于算法应用的博客,主要讨论如何使用广度优先搜索(BFS)策略解决一个数轴上的追逐问题。农夫从位置N开始,牛位于位置K,农夫有两种移动方式:向左右移动一格或直接移动到当前位置的两倍。题目要求找到农夫抓住牛所需的最短时间。提供的C++代码展示了如何实现这一算法,强调了在解决此类问题时BFS相对于深度优先搜索(DFS)的优势。
摘要由CSDN通过智能技术生成

广度优先搜索例题

农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上
,农夫起始位于点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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值