- 总时间限制:
- 2000ms
- 内存限制:
- 65536kB
- 描述
-
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟2、从X移动到2*X,每次移动花费一分钟假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛? - 输入
- 两个整数,N和K
- 输出
- 一个整数,农夫抓到牛所要花费的最小分钟数
- 样例输入
-
5 17
- 样例输出
-
4
普通的BFS。要注意剪枝和开大数组。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
int n,k;
bool vis[];
int pos[];
int step[];
void BFS(){
int hd=,tl=;
pos[++hd]=n;
step[hd]=;
while(hd<=tl){
int now=pos[hd];
if(now==k){
printf("%d\n",step[hd]);
return;
}
int next=now*;
if(next>= && next<= && !vis[next]){
vis[next]=;
pos[++tl]=next;
step[tl]=step[hd]+;}
next=now+;
if(next<= && !vis[next]){
pos[++tl]=next;
vis[next]=;
step[tl]=step[hd]+;}
next=now-;
if(next>= && !vis[next] ){
vis[next]=;
pos[++tl]=next;
step[tl]=step[hd]+;}
hd++;
}
}
int main(){
scanf("%d%d",&n,&k);
BFS();
return ;
}