zoukankan      html  css  js  c++  java
  • POJ 3278 Catch That Cow (有思路有细节的bfs)

    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

    别看题简单,满满的坑啊!!你初始在n,先让你移动到k,有三种移动,—1,+1,*2。问你几步能到k。
    最开始无脑搜,直接T了。后来发现bfs虽然是有点暴力的感觉但是还是要有思维在里面的!如果n>k,n只能一点点减到k。还有数组开大点,以防*2后越界。
    代码如下:
     1 #include <cstdio>
     2 #include <iostream>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <cmath>
     6 #include <queue>
     7 using namespace std;
     8 int n,k,ans;
     9 bool vis[400010];
    10 struct node
    11 {
    12     int pos,step;
    13 };
    14 bool check (int x)
    15 {
    16     if (vis[x])
    17     return 0;
    18     if (x<0||x>400010)
    19     return 0;
    20     else
    21     return 1;
    22 }
    23 void bfs (node now)
    24 {
    25 
    26     queue<node>q;
    27     q.push(now);
    28     while (!q.empty())
    29     {
    30         node temp=q.front();
    31         q.pop();
    32         if (check(temp.pos-1))
    33         {
    34             node x;
    35             x.pos=temp.pos-1;
    36             x.step=temp.step+1;
    37             vis[x.pos]=1;
    38             if (x.pos==k)
    39             {
    40                 ans=x.step;
    41                 return ;
    42             }
    43             q.push(x);
    44         }
    45         if (check(temp.pos+1)&&temp.pos<k)
    46         {
    47             node x;
    48             x.pos=temp.pos+1;
    49             x.step=temp.step+1;
    50             vis[x.pos]=1;
    51             if (x.pos==k)
    52             {
    53                 ans=x.step;
    54                 return ;
    55             }
    56             q.push(x);
    57         }
    58         if (check(temp.pos*2)&&temp.pos<k)
    59         {
    60             node x;
    61             x.pos=temp.pos*2;
    62             x.step=temp.step+1;
    63             vis[x.pos]=1;
    64             if (x.pos==k)
    65             {
    66                 ans=x.step;
    67                 return ;
    68             }
    69             q.push(x);
    70         }
    71     }
    72 }
    73 int main()
    74 {
    75     //freopen("de.txt","r",stdin);
    76     while (~scanf("%d%d",&n,&k))
    77     {
    78         memset(vis,false,sizeof vis);
    79         node now;
    80         now.pos=n;
    81         now.step=0;
    82         ans=0;
    83         if (n>=k)
    84         printf("%d
    ",n-k);
    85         else
    86         {
    87             bfs(now);
    88             printf("%d
    ",ans);
    89         }
    90     }
    91     return 0;
    92 }


  • 相关阅读:
    完成一个MVC+Nhibernate+Jquery-EasyUI信息发布系统
    SQL Server监控清单
    三大线性排序之基数排序
    使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)
    复制中的大批量更新
    碎片解决方案
    老猫总结的如何发布文件到手机中
    FMX对象释放
    MFC 窗口重绘问题
    如何将内存中的位图数据绘制在DC上
  • 原文地址:https://www.cnblogs.com/agenthtb/p/6028727.html
Copyright © 2011-2022 走看看