POJ 3278, Catch That Cow

Time Limit: 2000MS  Memory Limit: 65536K
Total Submissions: 13066  Accepted: 3968


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


// POJ3278.cpp : Defines the entry point for the console application.
//

#include 
<iostream>
#include 
<queue>
using namespace std;

int main(int argc, char* argv[])
{
    
int N, K;
    cin 
>> N >> K;

    
const int MAXSIZE = 200002;
    
int line[MAXSIZE];
    memset(line, 
-1sizeof(line));

    queue
<int> q;
    q.push(N);
    line[N] 
= 0;

    
while(!q.empty())
    {
        
int stp = q.front();
        q.pop();

        
int next = stp - 1;
        
if (next >= 0 && line[next] == -1)
        {
            line[next] 
= line[stp] + 1;
            q.push(next);
            
if (next==K)
                
break;
        }

        next 
= stp + 1;
        
if (next < MAXSIZE && line[next] == -1)
        {
            line[next] 
= line[stp] + 1;
            q.push(next);
            
if (next==K)
                
break;
        }

        next 
= stp << 1;
        
if (next < MAXSIZE && line[next] == -1)
        {
            line[next] 
= line[stp] + 1;
            q.push(next);
            
if (next==K)
                
break;
        }
    }

    cout 
<< line[K] << endl;
    
return 0;
}

posted @ 2009-10-10 23:33  Weiyu Wang  阅读(974)  评论(0编辑  收藏  举报