描述
农夫约翰已被告知逃亡牛的位置,并希望立即抓住她。他开始于一个点Ñ(0≤ Ñ ≤100,000)上的数线和牛是在点ķ(0≤ ķ上相同数目的线≤100,000)。农夫约翰有两种交通方式:步行和传送。
*行走:FJ可以在一分钟内从任意点X移动到X -1或X + 1 点
*传送:FJ可以在一分钟内从任意点X移动到点2× X .
如果母牛不知道它的追求,根本不动,那么农夫约翰需要多长时间才能找回它?
输入
第1行:两个以空格分隔的整数:N和K.
产量
第1行:Farmer John捕捉逃亡牛所需的最短时间(以分钟为单位)。
样本输入
<span style="color:#000000">5 17</span>
样本输出
<span style="color:#000000">4</span>
暗示
农夫约翰到达逃亡牛的最快方法是沿着以下路径前进:5-10-9-18-17,这需要4分钟。
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int MAX=100020; // 这个MAX的设定并不太严谨
int visited[MAX]={0};
int main()
{
int n,k;
while (cin>>n>>k){
if( n > k ){
cout<<n-k<<endl;
continue;
}
memset(visited,0,sizeof(visited));
queue<int> q;
q.push(n);
int t=0;
while( !q.empty() ){
t = q.front();
q.pop();
if(t == k){
break;
}
if( t < k && !visited[t+1] ){ // 当t>k时,不执行+1 action
q.push(t+1);
visited[t+1] = visited[t] + 1;
}
if( t > 0 && !visited[t-1] ){
q.push(t-1);
visited[t-1] = visited[t] + 1;
}
if( 2*t < MAX && !visited[2*t] ){
q.push(2*t);
visited[2*t] = visited[t] +1;
}
for(int i=0;i<20;i++){
cout<<visited[i];
}cout<<endl;
}
cout<<visited[t]<<endl;
}
return 0;
}
本文介绍了一个有趣的算法问题:一位农夫如何在数线上通过步行和传送的方式,用最短的时间找到静止不动的逃亡牛。文章通过示例解释了算法的实现过程,并提供了完整的代码实现。
5062

被折叠的 条评论
为什么被折叠?



