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.思维拓展
- DFS和BFS是基本的暴力技术,常用于解图、数的遍历问题
- 对于BFS用队列来处理这个过程十分的清晰易懂
- 通常需要有借助结构体、设置标记位、判断是否可以入队等基本思路
- 一维情况下只分两个方向,较为简单。二维情况下可以建立个二维数组表示方向。
………………
4.备注
欢迎大家一起相互讨论