• [poj] Catch That Cow--bfs


    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 - 1 or + 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, -1, *2  用bfs搜索 数组要开到最大值的2倍 注意剪枝和边界问题

    #include <iostream>
    #include <stdio.h>
    #include <queue>
    #include <cstring>
    using namespace std;
    
    const int Max = 210000;
    int s, e;
    struct node
    {
        int x, step;
    }now, Next;
    bool v[210000];
    queue<node>q;
    
    int bfs()
    {
        now.x = s;
        now.step = 0;
        v[s] = 1;
        q.push(now);
        while (!q.empty()) {
            now = q.front();
            q.pop();
            if (now.x == e)
                return now.step;
    
            Next.x = now.x*2;
            Next.step = now.step+1;
            if (Next.x >= 0 && Next.x <= Max && !v[Next.x]){
                q.push(Next);
                v[Next.x] = 1;
            }
    
            Next.x = now.x-1;
            Next.step = now.step+1;
            if (Next.x >= 0 && Next.x <= Max && !v[Next.x]){ 
                q.push(Next);  //若先检查v[Next.x] 会出现数组越界v[-1]的情况
                v[Next.x] = 1;
            }
    
            Next.x = now.x+1;
            Next.step = now.step+1;
            if (Next.x >= 0 && Next.x <= Max && !v[Next.x]){
                q.push(Next);
                v[Next.x] = 1;
            }
    
        }
        return 0;
    }
    
    int main()
    {
        //freopen("1.txt", "r", stdin);
        cin >> s >> e;
        memset(v, 0, sizeof(v));
        cout << bfs();
    
        return 0;
    }
  • 相关阅读:
    彩票股票金融与运气之研究(四)易道
    寻物一例
    彩票股票金融与运气之研究(三) 抽象模型
    彩票股票金融与运气之研究(一)前奏
    占何时可招到人
    占这单项目可成否
    C#控制DataMax打印机问题总结
    微软宣布Silverlight 5
    Windows Phone 7应用之sina微博——UI设计
    传言:Windows Phone 7“芒果”更新将增加 HTML5 支持
  • 原文地址:https://www.cnblogs.com/whileskies/p/7181939.html
Copyright © 2020-2023  润新知