Problem Description
Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting.
* Walking: FJ can move from any point X to the points X - 1 or X + 1 in a single minute
* Teleporting: FJ can move from any point X to the point 2 × X in a single minute.
If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?
* Walking: FJ can move from any point X to the points X - 1 or X + 1 in a single minute
* Teleporting: FJ can move from any point X to the point 2 × X in a single minute.
If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?
Input
Line 1: Two space-separated integers: N and K
Output
Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.
Sample Input
5 17
Sample Output
4
讲解:一农夫追牛,牛很笨,他就在原地等着农夫来抓他,并且这是一条直线,农夫很容易就能找到它的,然而农夫却只有三种选择,退一步,走一步,或者走到当前位置的2倍;于是乎我们可以用搜索来解决;
Hint
The fastest way for Farmer John to reach the fugitive cow is to move along the following path: 5-10-9-18-17, which takes 4 minutes.代码如下:
1 #include<algorithm> 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<queue> 6 using namespace std; 7 int n,m; 8 int map[200010]; 9 struct T 10 { 11 int x,step; 12 }; 13 int dfs(T now) 14 {queue< T >q; 15 T end; 16 q.push(now); 17 while(!q.empty()) 18 { 19 end=q.front(); 20 q.pop(); 21 map[end.x]=1; 22 if(end.x==m) 23 {return end.step;} 24 //如果不是走一步一判断很容易超出内存的 25 now.x=end.x+1;//前进一步,存入队列; 26 if(end.x>=0 && end.x<=100000 && map[now.x]==0) 27 { 28 now.step=end.step+1; 29 map[now.x]==1; 30 q.push(now); 31 } 32 now.x=end.x-1;//后退一步 33 if(end.x>=0 && end.x<=100000 && map[now.x]==0) 34 { 35 now.step=end.step+1; 36 map[now.x]==1; 37 q.push(now); 38 } 39 now.x=end.x*2;//前进2倍的位置 40 if(end.x>=0 && end.x<=100000 && map[now.x]==0) 41 { 42 now.step=end.step+1; 43 map[now.x]==1; 44 q.push(now); 45 } 46 } 47 return 0; 48 } 49 int main() 50 { 51 T now; 52 while(cin>>n>>m) 53 { 54 if(n>=m)//如果n大于m则只能后退了; 55 { 56 cout<<n-m<<endl;continue; 57 } 58 else 59 { 60 memset(map,0,sizeof(map)); 61 now.x=n;now.step=0; 62 int mm=dfs(now); 63 cout<<mm<<endl; 64 } 65 } 66 return 0; 67 }