描述
输入
两个整数,N和K
输出
一个整数,农夫抓到牛所要花费的最小分钟数
样例输入
样例输出
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
5 17
4
犯了一个我认为比较有意义的错误:广搜中必须要出队之后达到目标再输出。否则提前输出可能会因为没判断入队条件而出错
【代码】
#include<iostream>
#include<cstring>
#include<cstdio>
#define MAX 100000
using namespace std;
struct hp{
int num,step;
}queue[100005];
int n,m,head,tail,now,step,ans;
bool b[100005];
int main(){
scanf("%d%d",&n,&m);ans=MAX;
head=0,tail=1;
queue[tail].num=n,queue[tail].step=0,b[n]=true;
while (head<tail){
++head;
now=queue[head].num,step=queue[head].step;
if (now==m) {printf("%d",step);return 0;}
if (now+1<=MAX&&!b[now+1]) b[now+1]=true,queue[++tail].num=now+1,queue[tail].step=step+1;
if (now-1>=0&&!b[now-1]) b[now-1]=true,queue[++tail].num=now-1,queue[tail].step=step+1;
if (now*2<=MAX&&!b[now*2]) b[now*2]=true,queue[++tail].num=now*2,queue[tail].step=step+1;
}
}