描述:
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000),牛位于点K(0≤K≤100000)。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
输入描述:
两个整数,N和K。
输出描述:
一个整数,农夫抓到牛所要花费的最小分钟数。
用例输入 1
5 17
用例输出 1
4
提示
![](https://i-blog.csdnimg.cn/blog_migrate/f9f4c6c5fa17b6941e0303b957aaa374.png)
代码如下:
#include<bits/stdc++.h>
using namespace std;
int dl[100001][2]={},zt[100001]={};
int xx[3]={-1,1,0},yy[3]={1,1,2};
int main(){
int n,m;
cin>>n>>m;
dl[1][0]=n;//从n点开始搜索
dl[1][1]=0;//层数从0开始
for(int begin=1,end=1;begin<=end;begin++){
int x=dl[begin][0];//记录当前位置
if(x==m){//当找到时输出层数
cout<<dl[begin][1];
return0;
}
for(int k=0;k<3;k++){//做-1,+1,*2三种方式
if(x>m&&k>0){//如果大于m数只能跳过+1,*2部分
continue;
}
int tx=(x+xx[k])*yy[k];//记录三种方式后的位置
if(zt[tx]==0){
end++;//队尾加1
zt[tx]=1;//改变状态
dl[end][0]=tx;//记录队列队尾
dl[end][1]=dl[begin][1]+1;//层数加一
}
}
}
return 0;
}