POJ-3278 - Catch That Cow【BFS】

这是一道关于路径规划的问题,John需要抓住固定位置的奶牛。John有三种移动方式,包括向前、向后以及向前跳跃两倍距离,每种移动都耗时一分钟。如果John当前位置大于奶牛的位置,他只能向后移动。当John位置小于奶牛位置时,使用宽度优先搜索(BFS)策略来找到最短时间。

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

题意: John要去抓奶牛,奶牛不会移动,John移动的方式有三种:

  1. 向前移动一步,耗时一分钟;
  2. 向后移动一步,耗时一分钟;
  3. 向前移动当前所处的位置的2倍,耗时一分钟;

题解:1. if(N >= k),当John所处的位置大于奶牛的, John 只能向后一步一步移动,即耗时N - K ; 

    2. if(N < K),用BFS去解决; 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define INF 0x7ffffff
using namespace std;
const int maxn = 1e5+1;
int N, K;
struct node
{
    int x, step;
};
int vis[maxn];
int bfs(int n, int k)
{
    queue<node> q;
    memset(vis, 0, sizeof(vis));
    node S;
    S.x = n, S.step = 0;
    vis[n] = true;
    q.push(S);
    while(!q.empty())
    {
        node now = q.front(), next;
        if(now.x == k)
        {
            return now.step;
        }
        q.pop();
        for (int i = 0; i < 3; i++)
        {
            if(i == 0) next.x = now.x + 1;
                else if(i == 1) next.x = now.x - 1;
                    else next.x = now.x * 2;
            if(next.x < maxn && next.x >= 0 && !vis[next.x])
            {
                vis[next.x] = true;
                next.step = now.step + 1;
                q.push(next);
            }
        }
    }

}
int main()
{
    scanf("%d%d", &N, &K);

        if(N >= K)
            printf("%d\n", N-K);
        else
        printf("%d\n",bfs(N, K));



}
/*
4 4
Y.#@
....
.#..
@..M
4 4
Y.#@
....
.#..
@#.M
5 5
Y..@.
.#...
.#...
@..M.
#...#
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值