poj 3278 Catch That Cow

/*
A:Catch That Cow
查看 提交 统计 提问
总时间限制: 2000ms 内存限制: 65536kB
描述
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?

输入
Line 1: Two space-separated integers: N and K
输出
Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.
样例输入
5 17
样例输出
4
提示
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.
*/

#include <cstdio>
#include <list>
using namespace std;
int step[100005] = {0};
int n = 0, k = 0;
list <int> lst;

void bfs(int s)
{
    if(step[k]) return;
    if(s + 1 <= 100001&& step[s + 1] == 0 && s + 1 != n)
    {
        step[s + 1] = step[s] + 1;
        lst.push_back(s + 1);
    }
    if(s > 0 && s - 1 != n && step[s - 1] == 0)
    {
        step[s - 1] = step[s] + 1;
        lst.push_back(s - 1);
    }
    if(2 * s <= 100001 && step[2 * s] == 0 && 2 * s != n )
    {
        step[2 * s] = step[s] + 1;
        lst.push_back(2 * s);
    }
    return;
}

int main()
{
    scanf("%d%d", &n, &k);
    step[n] = 0;
    lst.push_front(n);
    while(!lst.empty())
    {
        //printf("%d\n", lst.front());
        bfs(lst.front());
        lst.pop_front();
    }
    printf("%d\n", step[k]);
    return 0;
}

你可能感兴趣的:(poj,cpp)