农夫约翰已经获悉逃跑的牛的位置,想立刻机住它。
农夫的位置在直线上的N(0≤N≤100,00)点,牛在同一直线上的k(0≤k≤10,00)点,约有步行和闪移两种走法。
步行:农夫约翰可以一分钟从点走到x-1或x+1点
物
闪移:衣夫约翰可以一分钟从点徒到2*x点
假设牛没有意识到农夫的行动,站在原地不动。问:农夫最少需要花多少时间时能机住那头牛?
输入
两个正数N,K(0≤N≤100,000)(0≤K≤100,000)
输出
一个整数,农夫抓住那头牛的最少时间
样例输入
5 17
样例输出
4
代码:
#include<bits/stdc++.h>
using namespace std;
int n,k;
int q[200010][2];
bool vis[200010];
int front,rear;
int main()
{
cin>>n>>k;
if(n==k)
{
cout<<0;
return 0;
}
front=rear=1;
q[1][0]=n;
q[1][1]=0;
vis[n]=true;
while(front<=rear)
{
int ft=q[front][1];
int fx=q[front][0];
int nx=fx-1;
if(nx>=0 && nx<=100000 && !vis[nx])
{
rear++;
q[rear][0]=nx;
q[rear][1]=ft+1;
vis[nx]=true;
if(nx==k)
{
cout<<q[rear][1];
return 0;
}
}
nx=fx+1;
if(nx>=0 && nx<=100000 && !vis[nx])
{
rear++;
q[rear][0]=nx;
q[rear][1]=ft+1;
vis[nx]=true;
if(nx==k)
{
cout<<q[rear][1];
return 0;
}
}
nx=fx*2;
if(nx>=0 && nx<=100000 && !vis[nx])
{
rear++;
q[rear][0]=nx;
q[rear][1]=ft+1;
vis[nx]=true;
if(nx==k)
{
cout<<q[rear][1];
return 0;
}
}
front++;
}
return 0;
}