<pre class="cpp" name="code"><span style="color:#333399;">/*
1417.Catch That Cow
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
一个农夫的牛丢了,现在要把牛找回来。
假设农夫和牛都在X轴上,牛不会动,农夫有两种移动方式。
步行:假设农夫当前位置是X,那么他可以走到X-1或X+1。
传送:假设农夫当前位置是X,那么他可以传送到2*X。(话说为何会传送还要做农夫)
无论那种方法,一次移动都需要花费一分钟的时间。
现在给你农夫和牛的初试坐标,请你输出农夫最快需要花多长时间可以找到牛。
输入
只有一行,包括两个整数N和K,分别表示农夫和牛的初试位置。
输出
输出一个整数,表示农夫最少要花多少分钟才能够找到牛。
输入样例
5 17
输出样例
4
By Yuan.c
2014.6.23
其实这个题非常简单,就是一个反向的深搜,只是当时考试的时候没有反应过来,真的是很遗憾
*/
#include<iostream>
#include<stdio.h>
using namespace std;
int x,y;
int mark[1000000];
int sum[1000000];
int a[1000000];
int sta=0,end=0,res=0;
void solve()
{int m;
while(1){
if(a[sta]==x){
res=sum[sta];
break;}
m=a[sta]+1;
if(mark[m]==0){
sum[++end]=sum[sta]+1;
mark[m]=1;
a[end]=m;
}
m=a[sta]-1;
if(mark[m]==0){
sum[++end]=sum[sta]+1;
mark[m]=1;
a[end]=m;
}
m=a[sta];
if(m%2==0){m=a[sta]/2;
if(mark[m]==0){
sum[++end]=sum[sta]+1;
mark[m]=1;
a[end]=m;
}}
sta++;}
}
int main()
{
cin>>x>>y;
sum[0]=0;
a[0]=y;
solve();
cout<<res<<endl;
return 0;
}
</span>