zoukankan      html  css  js  c++  java
  • POJ 3278 Catch That Cow (bfs)

    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.
     
     别忘记剪枝啊!要不然超时和超内存多难受TAT
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<queue>
     4 #include<vector>
     5 #include<cstring>
     6 #include<string>
     7 #include<algorithm>
     8 #include<map>
     9 #include<cmath>
    10 #include<math.h>
    11 using namespace std;
    12 
    13 int n,k,res;
    14 bool vis[200005];
    15 
    16 struct node
    17 {
    18     int p,t;//p是当前位置,t是所用时间
    19 }a;
    20 
    21 void bfs()
    22 {
    23     node tmp,next;
    24     queue<node>Q;
    25     Q.push(a);
    26     while(!Q.empty())
    27     {
    28         tmp=Q.front();
    29         Q.pop();
    30         if(tmp.p==k)
    31         {
    32             if(tmp.t<res)
    33                 res=tmp.t;
    34         }
    35         else if(tmp.t>res)
    36             continue;
    37         else 
    38         {
    39             next.t=tmp.t+1;
    40             //往前
    41             if(tmp.p<=k&&!vis[tmp.p+1])
    42             {
    43                 next.p=tmp.p+1;
    44                 Q.push(next);
    45                 vis[next.p]=true;
    46             }
    47             //往后
    48             if(tmp.p>=1&&!vis[tmp.p-1])
    49             {
    50                 next.p=tmp.p-1;
    51                 Q.push(next);
    52                 vis[next.p]=true;
    53             }
    54             //乘2
    55             if(tmp.p<=k&&!vis[tmp.p*2])
    56             {
    57                 next.p=tmp.p*2;
    58                 Q.push(next);
    59                 vis[next.p]=true;
    60             }
    61             
    62         }
    63         
    64     }
    65 }
    66 
    67 int main()
    68 {
    69     while(~scanf("%d%d",&n,&k))
    70     {
    71         res=abs(k-n);
    72         a.p=n;
    73         a.t=0;
    74         memset(vis,false,sizeof(vis));
    75         vis[n]=true;
    76         bfs();
    77         printf("%d
    ",res);
    78     }
    79     return 0;
    80 }
  • 相关阅读:
    c++跨平台技术学习(一)--使用公共的代码
    软件项目将死的27个征兆
    Java中的方法重载应用
    Java成员变量的初始化和在內存中的运行机制
    Java源文件结构和Java常用包
    细说Java访问控制符
    构造函数与this
    linux基础学习-6.3-DNS的配置文件
    linux基础学习-6.2-网卡配置文件
    linux基础学习-6.1-目录结构的特点
  • 原文地址:https://www.cnblogs.com/Annetree/p/7199292.html
Copyright © 2011-2022 走看看