“Catch That Cow“

        1.题目分析


        这是一道BFS(广度优先搜索)/DFS的算法题。相较于老鼠走迷宫,这是一道一维的BFS,做题之前可以进行预处理,将N >= K的情况单独解决,因为若农夫在牛前面那只能往后走。然后我们需要一个结构体来表示走到不同位置及已花费的时间,一个记录数组来表示走过的位置。然后就可以按照BFS的思路使用queue进行实现,代码如下:


        2.代码展示

  • 编辑器:Xcode Version 13.1

//
//  main.cpp
//  Catch that cow
//
//  Created by Jkchou on 2022/1/19.
//
//  农夫知道一头牛的位置,想要抓住它。农夫和牛都于数轴上 ,农夫起始位于点
//  N(0<=N<=100000),牛位于点K(0<=K<=100000) 。农夫有两种移动方式:
//  1、从 X移动到 X-1或X+1 ,每次移动花费一分钟
//  2、从 X移动到 2*X,每次移动花费一分钟
//  假设牛没有意识到农夫的行动,站在原地不动。最少要花多少时间才能抓住牛?

#include <iostream>
#include <queue>
using namespace std;
void CatchCowBFS(int x, int k);
int line[100010] = {0};//记录是否走过,因为走出去再走回来是无用的。
struct PassNode{
    int x;
    int minutes;
};
int main(){
    int N, K;
    cin>>N>>K;
    if (N == K)
        cout<<0<<endl;
    else if(N > K)
        cout<<N - K<<endl;
    else
        CatchCowBFS(N, K);

    return 0;
}
void CatchCowBFS(int x, int k){
    queue<PassNode> q;
    PassNode start;
    start = {x, 0};
    q.push(start);
    line[start.x] = 1;
    while (!q.empty()) {
        start = q.front();
        q.pop();
        if (start.x == k) {//目标时间
            cout<<start.minutes<<endl;
            return;
        }
        if (start.x - 1 >= 0 && !line[start.x -1]) {
            line[start.x - 1] = 1;
            PassNode next = {start.x - 1, start.minutes+1};
            q.push(next);
        }
        if (start.x + 1 <= 100000 && !line[start.x + 1]) {
            line[start.x + 1] = 1;
            PassNode next = {start.x + 1, start.minutes+1};
            q.push(next);
        }
        if (start.x * 2 <= 100000 && !line[start.x * 2]) {
            line[start.x * 2] = 1;
            PassNode next = {start.x * 2, start.minutes+1};
            q.push(next);
        }
    }
}

        3.思维拓展


  1. DFS和BFS是基本的暴力技术,常用于解图、数的遍历问题
  2. 对于BFS用队列来处理这个过程十分的清晰易懂
  3. 通常需要有借助结构体、设置标记位、判断是否可以入队等基本思路
  4. 一维情况下只分两个方向,较为简单。二维情况下可以建立个二维数组表示方向。

        ………………


        4.备注


        欢迎大家一起相互讨论

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值