Description
农场主约翰已被告知一头逃亡母牛的位置,他想立即抓住她。他从一条数线上的点N(0≤N≤100,000)开始,而cow在同一条数线上的点K(0≤K≤100,000)。农夫约翰有两种交通方式:步行和传送。 *步行:FJ可以在一分钟内从任何X点移动到X-1或X+1点 *传送:FJ可以在一分钟内从任意X点移动到2×X点。 如果这头母牛没有意识到它的追求,根本不动,农夫约翰需要多长时间才能找回它?
Input
第1行:两个空格分隔的整数:N和K(多组输入)
Output
第1行:农场主约翰抓住逃亡的母牛所需的最少时间,以分钟为单位。
Sample Input
5 17
Sample Output
4
C++ 代码
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
int n,k;
bool vis[200010];
int num[200010];
void bfs() {
queue<int>q;
q.push(n);
vis[n]=1;
while(!q.empty()) {
int t=q.front();
q.pop();
if(t==k) { //如果相等就输出
printf("%d\n",num[k]);
return;
}
int x=t+1;
if(x<=k&&!vis[x]) { //向前走一步 但不能超过了k还继续往前走 无意义
vis[x]=1;
num[x]=num[t]+1;
q.push(x);
}
x=t-1;
if(x>=0&&!vis[x]) { //向后退一步 不能退到0以后
vis[x]=1;
num[x]=num[t]+1;
q.push(x);
}
x=2*t;
if(t<k&&!vis[x]) { //步数乘2 如果超过了k还乘2 无意义
vis[x]=1;
num[x]=num[t]+1;
q.push(x);
}
}
}
int main() {
while(~scanf("%d%d",&n,&k)) {
memset(vis,0,sizeof vis);
memset(num,0,sizeof num);
bfs();
}
return 0;
}