问题描述:
农夫知道一头牛的位置,想要抓住它。农夫和牛都于数轴上 ,农夫起始位于点 N(0<=N<=100000) ,牛位于点 K(0<=K<=100000) 。农夫有两种移动方式:
1、从 X移动到 X-1或X+1 ,每次移动花费一分钟;
2、从 X移动到 2*X ,每次移动花费一分钟;
假设牛没有意识到农夫的行动,站在原地不动。最少要花多少时间才能抓住牛?
输入:
一行: 以空格分隔的两个字母: N 和 K
输出:
一行: 农夫抓住牛需要的最少时间。
输入样例:
5 17
输出样例:
4
样例解释:
农夫使用最短时间抓住牛的方案如下: 5-10-9-18-17, 需要4分钟.
算法分析:
在此问题中,农夫有三种移动方式,所求的是一个最短路的问题,适合于使用BFS的方法求解。只需要记录每一层的层数,在搜索到终点是退出BFS输出即可。
代码实现:
#include<iostream>
#include<queue>
using namespace std;
const int maxn = 100100;
int flag[maxn * 2]; //记录该位置是否已经走过。当flag值为1时,表示已经遍历过;当flag值为-1时,表示并未遍历过。
int bfs(int n, int k){
int time = 0; // 记录BFS遍历的层数
flag[n] = 1;
queue<int> q;
q.push(n);
while(!q.empty()){
int size = q.size();
for(int i = 0; i < size; i ++ ){
int tem = q.front();
q.pop();
flag[tem] = 1;
if(tem == k) return time; //BFS终点,返回time输出答案。
if(flag[tem * 2] == 0 && (tem * 2) >= 0 && (tem * 2) <= maxn)
q.push(tem * 2);
if(flag[tem + 1] == 0 && (tem + 1) >= 0 && (tem + 1) <= maxn)
q.push(tem + 1);
if(flag[tem-1] == 0 && (tem-1) >= 0 && (tem-1) <= maxn)
q.push(tem-1);
}
time ++ ;
}
}
int main(){
int n, k;
cin >> n >> k;
int ans = bfs(n, k);
cout << ans << endl;
return 0;
}