• hdoj 2717 Catch That Cow


    Problem 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.
    讲解:一农夫追牛,牛很笨,他就在原地等着农夫来抓他,并且这是一条直线,农夫很容易就能找到它的,然而农夫却只有三种选择,退一步,走一步,或者走到当前位置的2倍;于是乎我们可以用搜索来解决;
    代码如下:
     1 #include<algorithm>
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<queue>
     6 using namespace std;
     7 int n,m;
     8 int map[200010];
     9 struct T
    10 {
    11     int x,step;
    12 };
    13 int dfs(T now)
    14 {queue< T >q;
    15     T end;
    16     q.push(now);
    17     while(!q.empty())
    18     {
    19         end=q.front();
    20           q.pop();
    21         map[end.x]=1;
    22     if(end.x==m)
    23      {return end.step;}
    24      //如果不是走一步一判断很容易超出内存的
    25      now.x=end.x+1;//前进一步,存入队列;
    26          if(end.x>=0 && end.x<=100000 && map[now.x]==0)
    27          {
    28              now.step=end.step+1;
    29              map[now.x]==1;
    30              q.push(now);
    31          }
    32      now.x=end.x-1;//后退一步
    33      if(end.x>=0 && end.x<=100000 && map[now.x]==0)
    34      {
    35          now.step=end.step+1;
    36          map[now.x]==1;
    37          q.push(now);
    38      }
    39      now.x=end.x*2;//前进2倍的位置
    40      if(end.x>=0 && end.x<=100000 && map[now.x]==0)
    41      {
    42          now.step=end.step+1;
    43          map[now.x]==1;
    44          q.push(now);
    45      }
    46     }
    47     return 0;
    48 }
    49 int main()
    50 {
    51     T now;
    52     while(cin>>n>>m)
    53     {
    54         if(n>=m)//如果n大于m则只能后退了;
    55        {
    56            cout<<n-m<<endl;continue;
    57        }
    58        else
    59        {
    60         memset(map,0,sizeof(map));
    61         now.x=n;now.step=0;
    62         int mm=dfs(now);
    63         cout<<mm<<endl;
    64        }
    65     }
    66     return 0;
    67 }
  • 相关阅读:
    HTML音频/视频DOM 参考手册
    HTML5 应用程序缓存 和 视频
    HTML 5 新的Input类型
    快速开发平台消息通知中心之短信发送
    设计模式之单例设计模式
    反射
    多线程之线程安全
    01-sql优化及索引
    多线程之线程状态
    shell/linux定时清理日志文件
  • 原文地址:https://www.cnblogs.com/lovychen/p/3456478.html
Copyright © 2020-2023  润新知