zoukankan      html  css  js  c++  java
  • poj 3278 搜索

    描述:

    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来移动,每走一步用时一分钟,问移动到奶牛所在的位置需要多久。

    题解:

             广搜,分别进行+1,-1,*2操作,存入队列。

    代码:

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <queue>
    
    using namespace std;
    queue<int>q;
    int a,b;
    bool vis[100002];
    int step[100002];
    
    int bfs()
    {
        int u,v;
        q.push(a);
        step[a]=0;
        vis[a]=true;
        while(!q.empty())
        {
            u=q.front();
            q.pop();
            for(int i=0;i<3;i++)
            {
                if(i==0) v=u+1;
                else if(i==1) v=u-1;
                else v=u*2;
                if(v>=100001||v<0) continue;
                if(!vis[v])
                {
                    step[v]=step[u]+1;
                    vis[v]=true;
                    q.push(v);
                }
                if(v==b) return step[v];
            }
        }
        return -1;
    }
    
    int main()
    {
        while(cin>>a>>b)
        {
            memset(step,0,sizeof(step));
            memset(vis,false,sizeof(vis));
            while(!q.empty()) q.pop();
            if(a>=b) printf("%d
    ",a-b);
            else
            {
                int ans=bfs();
                cout<<ans<<endl;
            }
        }
        return 0;
    }
    
     
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 高精度乘法
    Java实现 蓝桥杯VIP 算法提高 高精度乘法
    Java实现 蓝桥杯VIP 算法提高 高精度乘法
    Java实现 蓝桥杯VIP 算法提高 高精度乘法
    Java实现 蓝桥杯VIP 算法提高 高精度乘法
    Java实现 蓝桥杯VIP 算法提高 现代诗如蚯蚓
    Java实现 蓝桥杯VIP 算法提高 现代诗如蚯蚓
    Java实现 蓝桥杯VIP 算法提高 现代诗如蚯蚓
    Java实现 蓝桥杯VIP 算法提高 现代诗如蚯蚓
    ddd
  • 原文地址:https://www.cnblogs.com/y1040511302/p/10177920.html
Copyright © 2011-2022 走看看