题目:
众所周知,yh学长 is very rich,他靠着玩超级大富翁的游戏富上加富,买下了地球的半座江山(另外半座他不想要啦!)。
Of course,yh学长啥都有,这其中当然也包括养猪场。
这天,yh学长正在养猪场里跟它们一起玩,他心血来潮点了个到:“花花、茉莉、小爱、仙子……???仙子呢?!Where are my dear Xianzi???!!!”
yh学长忽然发现名为“仙子”的小粉猪不见了!Oh no!这可是他最心爱的一头猪!!!
幸好yh学长在每只猪的身上都安装了高级GPS定位导航,通过智能腕表,他可以实时知道“仙子”的位置。
yh学长从一条直线上的一个点N (0 ≤ N ≤ 100,000) 开始,“仙子”在同一直线上的一个点K (0 ≤ K ≤ 100,000) 上。
yh学长迫不及待地想把“仙子”带回来,他决定现在就出发去找它。
可是作为一个 richer ,可选择的交通方式实在是太多了,到底要用什么交通方式去找呢?
yh学长想起“仙子”最爱的两个交通工具—— 南瓜老年代步车 以及 超级无敌霹雳豪华完美小巧简易宇宙飞船。
南瓜老年代步车南瓜老年代步车——yh学长可以在一分钟内从任何一点X移动到X-1或X+1两点。
超级无敌霹雳豪华完美小巧简易宇宙飞船超级无敌霹雳豪华完美小巧简易宇宙飞船——yh学长可以在一分钟内从任何X点移动到2*X点。
已知“仙子”在离家出走一段时间后就反悔了,
十分地想念yh学长(这就是双向奔赴吗(T▽T)磕到了磕到了ヾ(◍°∇°◍)ノ゙),
但它太累了,于是决定在原地不动等yh学长来找它。
请问yh学长至少需要多长时间才能把它找回来?
Input
第一行输入两个整数 N 和 K
Output
输出一个整数——yh学长至少花多长时间才能把“仙子”找回来?
Sample Input
5 17
Sample Output
4
Hint
yh学长到达“仙子”所在地的最快方法是沿着以下路径移动:5-10-9-18-17,这需要4分钟。
题解:
需要两个数组,一个是看他有没有来过,一个去计算他的步数;
用head 跟 next 代表他的开始和第二步 需要用到一个队列 不需要优先即queue <int> q;
用while(!empty())来使他循环 先把用q.front 把值给head 再用q。pop()消掉第一个值
使用一个for包含三个循环 用next作为他的下一步 要注意防止突破极限 使用一个 if
再用前面提到的标记数组判断next来过没有
如果来过 用步数数组计算他的步数 即step【head】=step【next】+1;
最后判断这个head是不是等于你的目标
如果等于 return step【head】;
代码:
#include<iostream>
#include<queue>
using namespace std;
queue<int> q;
bool vis[100005];
int step[100005];
int bfs(int x, int y)
{
int next,head,i;
q.push(x);
vis[x]=true;
step[x]=0;
while(!q.empty())
{
head=q.front();
q.pop();
for(i=0;i<3;i++)
{
if(i==0)
next=head-1;
else if(i==1)
next= head+1;
else
next=head*2;
if(next<0||next>100000) //超界限了
continue;
if(!vis[next])
{
vis[next]=true;
step[next]=step[head]+1;
q.push(next);
}
if(head==y)
return step[head];
}
}
}
int main()
{
int x,y;
cin>>x>>y;
if(x>=y)
cout<<x-y<<endl;
else
cout<<bfs(x,y)<<endl;
return 0;
}