【题目描述】
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000)
,牛位于点K(0≤K≤100000)
。农夫有两种移动方式:
1、从X
移动到X−1或X+1
,每次移动花费一分钟
2、从X移动到2×X
,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
【输入】
两个整数,N
和K
。
【输出】
一个整数,农夫抓到牛所要花费的最小分钟数。
【输入样例】
5 17
【输出样例】
4
// Created on 2020/2/8
/*#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <climits>*/
#include <bits/stdc++.h>
#define MAXX 40*40+5
using namespace std;
//int i,j,k;
const int maxn=INT_MAX;
const int idata=100000+5;
//int aim[idata];
bool judge[idata];
bool flag;
int soux,souy,
exitx,exity;
//int maps[idata][idata];
//const int change[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
long long n,m;
long long Count[idata];
long long nx,ny;
long long x[idata];
int main()
{
long long head,tail;
int i;
cin>>n>>m;
head=0,tail=1;
x[1]=n;
judge[n]=true;
Count[n]=0;
while(head<tail)
{
head++;
for(i=0;i<3;i++)
{
switch(i)
{
case 0:nx=x[head]+1;break;
case 1:nx=x[head]-1;break;
case 2:nx=x[head]*2;break;
}
if(nx<=idata&&nx>=0&&!judge[nx])
{
judge[nx]=true;
tail++;
Count[nx]=Count[x[head]]+1;
x[tail]=nx;
}
if(nx==m)
{
flag=true;
break;
}
}
if(flag) break;
}
cout<<Count[m]<<endl;
return 0;
}