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