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