题目描述
有一只鸡和一条狗,他们在一条线上,鸡的位置在点N处,狗在点M处,鸡和狗约定,狗站那不动,鸡去找狗。可以一次向左或向右走一步,也可一次飞到原来所在位置的2倍处。鸡飞一次和走一步时间相同。为了不让狗等得着急,鸡最快多长时间能到狗的位置。
输入格式
多组测试数据,每组一行N,M(0<=N,M<=100000).
输出
输出鸡到狗位置的最短时间.
样例输入
5 17
样例输出
4
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
int rem[50005];//记录状态
int pmin;//记录移动次数
using namespace std;
struct point
{
int x,y;
} pbegin,pend; //pbegin是鸡的位置,end是狗的位置
void bfs(point s)
{
if(s.x>=pend.x)//如果鸡在狗右边,由于飞的话是原来位置的两倍,所以只能左移,一次一步
{
pmin=s.x-pend.x;
return;
}
queue<point> q;
point now=s,next;//next是下一步
q.push(s);//入队
rem[s.x]=1;//标记
while(!q.empty())
{
now=q.front();
if(now.x==pend.x)//到达狗的位置时
{
pmin=now.y;
return;
}
next.x=now.x-1; //左移
if(next.x>=0&&!rem[next.x])//尚未走过,且大于0 (N,M(0<=N,M<=100000))
{
next.y=now.y+1;
q.push(next);
rem[next.x]=1;
}
next.x=now.x+1;//右移
if(next.x<=pend.x&&!rem[next.x])
{
next.y=now.y+1;
q.push(next);
rem[next.x]=1;
}
next.x=now.x*2;//飞
if(next.x<=pend.x+1&&rem[next.x])
{
next.y=now.y+1;
q.push(next);
rem[next.x]=1;
}
q.pop();
}
}
int main()
{
while(cin>>pbegin.x>>pend.x)
{
pbegin.y=0;
memset(rem,0,sizeof(rem));
pmin=99999;
bfs(pbegin);
cout<<pmin<<endl;
}
}