Catch That Cow

本文介绍了一个有趣的算法问题:一位农夫如何在数线上通过步行和传送的方式,用最短的时间找到静止不动的逃亡牛。文章通过示例解释了算法的实现过程,并提供了完整的代码实现。

描述

农夫约翰已被告知逃亡牛的位置,并希望立即抓住她。他开始于一个点Ñ(0≤ Ñ ≤100,000)上的数线和牛是在点ķ(0≤ ķ上相同数目的线≤100,000)。农夫约翰有两种交通方式:步行和传送。

*行走:FJ可以在一分钟内从任意点X移动到X -1或X + 1 点
*传送:FJ可以在一分钟内从任意点X移动到点2× X .

如果母牛不知道它的追求,根本不动,那么农夫约翰需要多长时间才能找回它?

输入

第1行:两个以空格分隔的整数:NK.

产量

第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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值