zoukankan      html  css  js  c++  java
  • POJ3275——BFS——Catch That Cow

    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.

    Source

    大意:从n到k可以两种变化,一是把n翻倍,二是把n-1或n+1,问最小的步数实现
    用BFS,广度优先搜索,使用队列。
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    int n,p,countn,k;
    struct edge{
        int x;
        int c;
    }a[200010];
    queue <edge> q;
    int visit[200010];
    int bfs()
    {
        while(!q.empty()){
               p = q.front().x;
               countn = q.front().c;
               q.pop();
               if(p == k)
                return countn;
               if(!visit[p-1] && p > 0){
                    visit[p-1] = 1;
                    a[p-1].x = p-1;
                    a[p-1].c = countn+1;
                    q.push(a[p-1]);
               }
               if(p < k){
                   if(!visit[p+1]){
                        visit[p+1] = 1;
                        a[p+1].x = p+1;
                        a[p+1].c = countn+1;
                        q.push(a[p+1]);
                   }
                   if(!visit[p*2]){
                        visit[p*2] = 1;
                        a[p*2].x = p*2;
                        a[p*2].c = countn+1;
                        q.push(a[p*2]);
                   }
               }
        }
    }
    int main()
    {
       while(~scanf("%d%d",&n,&k)){
           memset(visit,0,sizeof(visit));
           memset(a,0,sizeof(a));
            while(!q.empty())
            q.pop();
            visit[n] = 1;
           a[n].x = n;
           a[n].c = 0;
           q.push(a[n]);
           printf("%d
    ",bfs());
       }
       return 0;
    }
    View Code
  • 相关阅读:
    JavaScript学习——使用JS实现首页轮播图效果
    JavaScript学习——使用JS完成注册页面表单校验
    JavaScript基础
    HTML&CSS——使用DIV和CSS完成网站首页重构
    HTML&CSS——网站注册页面
    java ------------ 集合(四) Collections类
    Java ---------- 集合(三) Map接口
    java ---------- 集合(二) Set 接口和Iterator 接口
    Java ---------- 集合
    idea -------- 常用快捷键
  • 原文地址:https://www.cnblogs.com/zero-begin/p/4340104.html
Copyright © 2011-2022 走看看