【题目描述】
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000)N(0≤N≤100000),牛位于点K(0≤K≤100000)K(0≤K≤100000)。农夫有两种移动方式:
1、从XX移动到X−1X−1或X+1X+1,每次移动花费一分钟
2、从X移动到2×X2×X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
【输入】
两个整数,NN和KK。
【输出】
一个整数,农夫抓到牛所要花费的最小分钟数。
【输入样例】
5 17
【输出样例】
4
思路:
一维的BFS。三种走法。
代码:
#include<iostream>
#include<cstring>
using namespace std;
const int N=100010;
//const int flag[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
//int a[N];
int q[100010];
int n,m;
bool p[N];
int d[N];
int s;
void bfs(int x)
{
int front=0,rear=2;
q[1]=x;
d[x]=0;
while(front<rear-1)
{
++front;
x=q[front];
if(x==m){
cout<<d[x]<<endl;
return;
}
for(int i=0;i<3;++i)
{
int x1;
if(i==1)x1=x+1;
else if(i==2)x1=x-1;
else x1=x*2;
if(x1<0||x1>100000||p[x1])continue;
p[x1]=true;
q[rear++]=x1;
d[x1]=d[x]+1;
}
}
}
int main()
{
cin>>n>>m;
bfs(n);
return 0;
}