zoukankan      html  css  js  c++  java
  • 超超超简单的bfs——POJ-3278

    Catch That Cow
    Time Limit: 2000MS   Memory Limit: 65536K
    Total Submissions: 89836   Accepted: 28175

    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 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?

    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.
     
     
    起点在n,终点是k,每一步可以是+1、-1或*2,最少走几步?
     
     1 #include<stdio.h>
     2 #include<queue>
     3 #include<string.h>
     4 using namespace std;
     5 int a[200005];//一个2倍大小的数组代表可以走到的位置,因为有乘二所以要开二倍以防RE,a[i]=x  -->  走到坐标i需要x步
     6 int main()
     7 {
     8     int n, k, t;
     9     queue<int>q;
    10     scanf("%d%d", &n, &k);
    11     memset(a, -1, sizeof(a));//所有坐标初始化为-1
    12     a[n] = 0;                //n走到n当然是需要步
    13     q.push(n);                //当前位点入队
    14     while (!q.empty())
    15     {
    16         t = q.front();        //读取队首
    17         q.pop();            //删除队首
    18         if (t == k)            //若到达终点则直接输出并结束
    19         {
    20             printf("%d
    ", a[k]);
    21             return 0;
    22         }
    23         if (t - 1 >= 0 && a[t - 1] == -1)//可能到达的结点入队,要判断是否越界,走过的不再走
    24         {
    25             a[t - 1] = a[t] + 1; q.push(t - 1);//下一步走到的位点所需步数是当前位点的步数+1
    26         }
    27         if (t + 1 < 200001 && a[t + 1] == -1)
    28         {
    29             q.push(t + 1); a[t + 1] = a[t] + 1;
    30         }
    31         if (t * 2 < 200004 && a[t * 2] == -1)
    32         {
    33             q.push(t * 2); a[t * 2] = a[t] + 1;
    34         }
    35     }
    36 }

    简单的bfs

     
  • 相关阅读:
    eclipse快速收缩展开代码
    Java中this关键字在构造方法中的使用
    Java中String的常用方法
    Java中的Comparable<T>和Comparator<T>接口
    Oracle中的自增-序列-SEQUENCE
    Java中的代码块
    Oracle中的约束
    Oracle中对表的操作
    ROWID-Oracle中删除重复行数据
    Selenium简单回顾
  • 原文地址:https://www.cnblogs.com/jinmingyi/p/6832321.html
Copyright © 2011-2022 走看看