HDU2717BFS

/*
	WA了12发简直不能忍!!
	
	题意很简单,从正整数a变为b有三种方法:
	+1,-1,*2
	
	特殊情况一:a与b相等不需要搜索
	特殊情况二:a>b时,结果必然是a-b不需搜 
	特殊情况三:比较坑!!!
		当 a 与 b 差别较大的时候,若一直按照三种方法产生子节点的话,
			不断不断不断不断不断*2*2*2*2*2是很容易超过数组长度的
			而且当不断*2超过k之后,再次产生的新节点并没有意义,所以产生*2类型的新节点时要加判断条件
	
	希望自己能够长记性
	大家也能一起加油 
*/ 

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;

#define MAXN 200000

int main() 
{
	int que[MAXN];
	int book[MAXN];
	int i,j,k,m,n,head,tail,new_pos;
	while(cin>>n>>k)
	{
		memset(book,0,sizeof(book));
		if (n==k)
		{
			printf("0\n");
			continue;
		}
		if (n>k)
		{
			printf("%d\n",n-k);
			continue;
		}
		head=tail=1;
		que[head]=n;
		while(!book[k]&&head<=tail)
		{
			new_pos=que[head]+1;
			if (!book[new_pos])
				que[++tail]=new_pos,book[new_pos]=book[que[head]]+1;
			new_pos=que[head]-1;
			if (!book[new_pos])
				que[++tail]=new_pos,book[new_pos]=book[que[head]]+1;
			new_pos=que[head]*2;
			if (!book[new_pos]&&new_pos<=2*k)//这句话的后半句是精髓,试了很多很多次! 
				que[++tail]=new_pos,book[new_pos]=book[que[head]]+1;
			head++;
		}
		cout<<book[k]<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值