描述
农夫John 刚刚获悉一头逃跑的牛的位置,打算立刻就去把它抓回来。
John 和 牛 都站在一条直线上,开始时 John 位于坐标点 N 上 (0≤N≤100,000),牛位于坐标点 K 上 (0≤K≤100,000) 。
John 有两种行动方式:步行 和 瞬移(这种技能不是一般群众具备的哦)。
步行:John 花一分钟由任意点 X 步行到点 X−1 或点 X+1
瞬移:John 花一分钟由任意点 X 瞬移到点 2×X
假设牛不知道 John 来抓它,一直站在原地吃草。
问 John 最少需要花多少分钟才能抓到它?
输入描述
多测试用例,每个用例一行:两个整数:N 和 K,用空格分隔。
最后一行是两个 −1,表示结束,不用处理。
输出描述
每个用例一行结果:一个整数:John 抓住逃跑的牛最少需要多少分钟。
用例输入 1
5 17 -1 -1
用例输出 1
4
#include<iostream>
#include<memory.h>
using namespace std;
#define MAX 100010
int v[MAX],t[MAX],q[MAX];
int h,p;
void cow(int b,int a){
if(b>=0&&b<MAX&&v[b]==0){
v[b]=1,t[b]=t[a]+1;
q[p]=b;
p++;
if(p==MAX){
p=0;
}
}
}
int main(){
int n,k;
int a;
while(cin>>n>>k){
if(n==-1&&k==-1){
break;
}
memset(v,0,sizeof(v));
t[k]=-1;
v[n]=1;
t[n]=0;
q[0]=n;
h=0;
p=1;
while(h!=p&&t[k]==-1){
a=q[h];
h++;
cow(a+1,a);
cow(a-1,a);
cow(2*a,a);
}
cout<<t[k]<<endl;
}
return 0;
}