【openjudge】抓住那头牛

描述

农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:

1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟

假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?


输入
两个整数,N和K
输出
一个整数,农夫抓到牛所要花费的最小分钟数
样例输入
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; 
	}
}



你可能感兴趣的:(搜索,OpenJudge)