• poj-3278 catch that cow(搜索题)


    题目描述:

    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.
     
    题目大意:人追牛,人可以加减一步或者两倍
    解题思路:就是bfs搜索
     
     
    AC代码
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<sstream>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    using namespace std;
    #define PI 3.14159265358979323846264338327950
    
    struct point
    {
        int x,y,step;
    }st;
    
    queue<point>q;
    int vis[200002];
    int n,m,flat;
    
    int bfs()
    {
        while(!q.empty())
        {
            q.pop();
        }
        
        memset(vis,0,sizeof(vis));
        vis[st.x]=1;
        q.push(st);
        while(!q.empty())
        {
            point now=q.front();
            if(now.x==m)
                return now.step;
            q.pop();
            for(int j=0;j<3;j++)
            {
                point next = now;
                if(j == 0)
                    next.x=next.x+1;
                else if(j==1)
                    next.x=next.x-1;
                else
                    next.x=next.x*2;
                ++next.step;
                if(next.x==m)
                    return next.step;
                if(next.x>=0 && next.x<=200000 && !vis[next.x])
                {
                    vis[next.x]=1;
                    q.push(next);
                }
            }
        }
        return 0;
    }
    int main()
    {
        while (~scanf("%d %d", &n, &m))
        {
            st.x = n;
            st.step=0;
            printf("%d
    ", bfs());
        }
      return 0;
            
    }
  • 相关阅读:
    10月1日学习日志
    RK987三模键盘使用说明书
    信封中装有10张奖券,只有一张有奖,从信封中每次抽取1张奖券后放回,如此重复抽取n次,中奖的概率为P,求P的表达式。
    SAP自动过账的概念
    SAP内部订单使用
    SAP凭证日期,过账日期的区别
    SAP增强
    金融财团控制全球经济的四种武器
    联想ZUI应用图标自动排序
    SAPFICO基础(1)
  • 原文地址:https://www.cnblogs.com/smallhester/p/9498670.html
Copyright © 2020-2023  润新知