<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>