简单搜索–BFS–Catch That Cow
Description
农夫约翰已被告知一头逃亡牛的下落,并希望立即抓住她。他从某一时刻开始N(0≤)N(≤100,000)在一个数字线上,母牛在一个点上K(0≤)K(≤100,000)在相同的数字线上。农民约翰有两种运输方式:步行和传送。
*步行:可以从任何地方移动X各点X -1或X 一分钟内+1
*传送:可以从任何地方移动X点2×X一分钟之内。
如果母牛没有意识到它的追求,根本不动,农场主约翰需要多长时间才能找回它?
Input
第1行:两个空格分隔的整数:N和K
Output
第1行:最短的时间,在几分钟内,农夫约翰就能抓住逃亡的母牛。
Sample Input
5 17
Sample Output
4
简单的bfs问题,每次进队列列好每一种情况,再进队,传递好时间,就OK
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <string>
#include <stack>
#include <queue>
#include <map>
using namespace std;
const int inf=0x3f3f3f3f;
const int MAX=100000+5;
int vla[MAX];
int N,K;
int bfs()
{
queue <int> q;
q.push(N);
while(!q.empty())
{
int a=q.front();
q.pop();
int b=a-1;
int c=a+1;
int d=a*2;
if(b>0&&b<MAX&&!vla[b]) vla[b]=vla[a]+1,q.push(b);
if(c<=MAX&&!vla[c]) vla[c]=vla[a]+1,q.push(c);
if(d<=MAX&&!vla[d]) vla[d]=vla[a]+1,q.push(d);
if( b==K || c==K || d==K ) return 0;
}
}
int main()
{
while(cin>>N>>K)
{
memset(vla,0,sizeof(vla));
if(N>=K)
{
cout<<N-K<<endl;
continue;
}
bfs();
cout<<vla[K]<<endl;
}
return 0;
}