Catch That Cow
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 30924   Accepted: 9536

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?

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

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 /* 功能Function Description:     POJ 3278 Catch That Cow
 2    开发环境Environment:          DEV C++ 4.9.9.1
 3    技术特点Technique:
 4    版本Version:
 5    作者Author:                    可笑痴狂
 6    日期Date:                      20120730
 7    备注Notes:                     深搜---队列
 8 */
 9 #include<iostream>
10 #include<queue>
11 #define MAX 100001
12 using namespace std;
13 
14 queue<int> q;
15 bool visit[MAX];
16 int step[MAX];       //记录步数的数组不能少
17 
18 bool bound(int num)
19 {
20     if(num<0||num>100000)
21         return true;
22     return false;
23 }
24 
25 int BFS(int st,int end)
26 {
27     queue<int> q;
28     int t,temp;
29     q.push(st);
30     visit[st]=true;
31     while(!q.empty())
32     {
33         t=q.front();
34         q.pop();
35         for(int i=0;i<3;++i) //三个方向搜索 
36         {
37             if(i==0)
38                 temp=t+1;
39             else if(i==1)
40                 temp=t-1;
41             else
42                 temp=t*2;
43             if(bound(temp))         //越界
44                 continue;
45             if(!visit[temp])
46             {
47                 step[temp]=step[t]+1;
48                 if(temp==end)
49                     return step[temp];
50                 visit[temp]=true;
51                 q.push(temp);
52             }
53         }
54     }
55 }
56 
57 int main()
58 {
59     int st,end;
60     while(scanf("%d%d",&st,&end)!=EOF)
61     {
62         memset(visit,false,sizeof(visit));
63         if(st>=end)
64             cout<<st-end<<endl;
65         else
66             cout<<BFS(st,end)<<endl;
67     }
68     return 0;
69 }

 

posted on 2012-07-30 09:22  可笑痴狂  阅读(2675)  评论(1编辑  收藏  举报