C++版广度优先搜索(抓住那头牛)

问题描述:

农夫知道一头牛的位置,想要抓住它,农夫和牛都位于数轴上,农夫起始点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:

1.从x移动到x-1或x+1,每次花费1分钟。

2.从x移动到2*x,每次移动花费1分钟。

牛不动,求农夫抓住牛移动的最小花费时间是多少。

输入N=5, K=17 ,输出 4。


求解思路:

这个问题可以转化成三叉树层序遍历的模型,可以使用广度优先遍历算法进行最小花费时间的计算。


三叉树图

C++代码:

#include<iostream>

#include<vector>

#define  MaxNum 100001

using namespace std;

int step[MaxNum];

bool vis[MaxNum];

vector<int> num_vec;

int CatchCattle(int n, int k) {

int head = 0;

int tail = 1;

int index = 0;

num_vec.emplace_back(n);

while (head < tail) {

n = num_vec[index];

int tmp = num_vec[index];

if (tmp == k) {

return step[tmp];

}

tmp = n - 1;

if (!vis[tmp] && tmp >= 0) {

vis[tmp] = 1;

step[tmp] = step[n] + 1;

num_vec.emplace_back(tmp);

if (tmp == k) {

return vis[tmp];

}

}

tmp = n + 1;

if (!vis[tmp] && tmp < MaxNum) {

vis[tmp] = 1;

step[tmp] = step[n] + 1;

num_vec.emplace_back(tmp);

if (tmp == k) {

return step[tmp];

}

}

tmp = 2 * n;

if (!vis[tmp] && tmp < MaxNum) {

vis[tmp] = 1;

step[tmp] = step[n] + 1;

num_vec.emplace_back(tmp);

if (tmp == k) {

return step[tmp];

}

}

index++;

head++;

tail++;

}

return true;

}

int main() {

int N, K;

cin >> N >> K;

cout << CatchCattle(N, K) << endl;

return 0;

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容