然而,十四大师并不满足于现有的一切,他想要让自己的实力有更进一步的提升。为此,他专程前往二次元世界修行。
二次元旅程归来的十四大师学习了新的技能——闪现。
在一条既定的直线道路上,“闪现”技能允许十四大师超时空移动。如果把道路视为一条数轴,使用闪现可以让十四大师瞬间移动到脚下坐标两倍的位置上。例如,如果十四大师站在坐标5的位置上,他可以直接闪现到坐标10的位置,如果继续闪现,则可以到达坐标20的位置上。
现在十四大师打算练习一下“闪现”在生活中的应用。我们假定他站在坐标为a的位置上,而他想要到达坐标为b的位置(0 ≤a,b≤100000)。除了使用闪现外,他也可以像常人一样徒步向前或者向后走,而使用闪现视为行走了一步。请问十四大师最少需要走多少步才可以到达目标?
Input
输入包含多组数据。每组数据占一行,包含两个整数a和b,表示十四大师的起始坐标和目的地坐标。(0 ≤a,b≤100000)
Output
对于每组输入,输出一个整数,即十四大师到达目的地的最少步数。
Sample Input
5 17
Sample Output
4
Hint
对于样例数据,最少步数的走法是:从坐标5闪现到坐标10,后退一步到坐标9,再闪现到坐标18,最后后退一步即到达坐标17。总共四步。
wa:
1.要考虑k==n的情况
2.要减枝,k.x<ku,否则RE
3.k.x-1时要考虑是否越界。
ac代码
# include <iostream>
# include <algorithm>
# include <cstring>
# include <cstdio>
# include <queue>
using namespace std;
struct node
{
long long num,x;
};
long long n,ku;
queue<node>pd;
int a[200050];
void bfs()
{
while (!pd.empty())
{
node k=pd.front();
pd.pop();
if (k.x==ku)
{
cout << k.num <<endl;
break;
}
if ((k.x+1==ku)||(k.x-1==ku)||(k.x*2==ku))
{
cout << k.num+1 <<endl;
break;
}
else
{
if (a[k.x-1]==0&&k.x-1>=0)
{
node s;
s.num=k.num+1;
s.x=k.x-1;
pd.push(s);
a[k.x-1]=1;
}
if (k.x<ku&&a[k.x+1]==0)
{
node s;
s.num=k.num+1;
s.x=k.x+1;
pd.push(s);
a[k.x+1]=1;
}
if (k.x<ku&&a[k.x*2]==0)
{
node s;
s.num=k.num+1;
s.x=k.x*2;
pd.push(s);
a[k.x*2]=1;
}
}
}
return ;
}
int main ()
{
while (cin >> n >> ku)
{
memset (a,0,sizeof(a));
while (!pd.empty())
pd.pop();
node k;
k.num=0;
k.x=n;
pd.push(k);
a[n]=1;
bfs();
}
return 0;
}