【题目描述】
农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上出发,尽快把那只奶牛抓回来.
他们都站在数轴上.约翰在N(O≤N≤100000)处,奶牛在K(O≤K≤100000)处.约翰有两种办法移动,步行和瞬移:步行每秒种可以让约翰从x处走到x+l或x-l处;而瞬移则可让他在1秒内从x处消失,在2x处出现.然而那只逃逸的奶牛,悲剧地没有发现自己的处境多么糟糕,正站在那儿一动不动.
那么,约翰需要多少时间抓住那只牛呢?
【输入格式】
仅有两个整数N和K
【输出格式】
最短时间
【样例输入】
5 17
【样例输出】
4
#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn=100007;
int d[maxn];
int main(){
memset(d,-1,sizeof(d));
int n,k;
scanf("%d%d",&n,&k);
queue<int> q;
q.push(n);
d[n]=0;
while(!q.empty()){
int u=q.front();
q.pop();
if(u==k){
printf("%d",d[u]);
return 0;
}
if(u*2<=100000)
{
if(d[u*2]<0)
{
d[u*2]=d[u]+1;
q.push(u*2);
}
}
if(u+1<=100000)
{
if(d[u+1]<0)
{
d[u+1]=d[u]+1;
q.push(u+1);
}
}
if(u-1>=0)
{
if(d[u-1]<0)
{
d[u-1]=d[u]+1;
q.push(u-1);
}
}
}
return 0;
}