POJ3278 Catch That Cow

                                                                                      Catch That Cow

Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 18320   Accepted: 5630

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.

Source

USACO 2007 Open Silver

 

  1      #include <cstdlib>
  2 #include <iostream>
  3 #include <cstdio>
  4 
  5 #include <string.h>
  6 using namespace std;
  7 bool a[200005];
  8 struct Node{
  9        int  x;
 10       int num;
 11        }node[200005];
 12 int front,end;
 13 int bfs(int n,int m)
 14 {
 15     
 16     Node node1;
 17     front=0;
 18     end=0;
 19     node[end].x=n;
 20     node[end].num=0;
 21     end++;
 22     
 23     
 24     while(front<end)
 25     {node1.num=node[front].num+1;
 26     
 27     
 28     
 29     
 30     
 31      
 32      node1.x=node[front].x*2;
 33      
 34      if(node1.x<=(2*m))
 35      {if(node1.x==m)
 36      return node1.num;
 37      if((node1.x>=0)&&(!a[node1.x]))
 38      {node[end].x=node1.x;node[end].num=node1.num;end++;a[node1.x]=true;}
 39      }
 40      
 41      node1.x=node[front].x+1;
 42      
 43      if(node1.x<=(2*m))
 44      {
 45      if(node1.x==m)
 46      return node1.num;
 47      if((node1.x>=0)&&(!a[node1.x]))
 48      {node[end].x=node1.x;node[end].num=node1.num;end++;a[node1.x]=true;}
 49      }
 50      
 51      
 52      node1.x=node[front].x-1;
 53      
 54      if(node1.x<=(2*m))
 55      {
 56      if(node1.x==m)
 57      return node1.num;
 58      if((node1.x>=0)&&(!a[node1.x]))
 59      {node[end].x=node1.x;node[end].num=node1.num;end++;a[node1.x]=true;}
 60      }
 61      
 62      front++;
 63      
 64     }
 65      
 66     
 67 }
 68  
 69 
 70 
 71 int main(int argc, char *argv[])
 72 {
 73     
 74     
 75 int n,m;
 76 cin>>n>>m;
 77 
 78 int i;
 79 
 80 int t;
 81 if(n>=m)
 82 cout<<n-m<<endl;
 83 else
 84 {
 85 for(i=0;i<=200005;i++)
 86 a[i]=false;
 87 a[n]=true;
 88 t=bfs(n,m);
 89 cout<<t<<endl;
 90 }
 91 
 92 
 93 
 94 
 95 
 96 
 97 //system("PAUSE");
 98 
 99                                  
100     
101     return EXIT_SUCCESS;
102 }
posted @ 2012-05-31 11:38  cseriscser  阅读(196)  评论(0编辑  收藏  举报