M - 搜索

Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

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.
思路分析:求最小步数,用BFS即可水过,不过由于本弱BFS刚刚入门,在做题的时候还是出现了很多问题,BFS一般要采用队列来进行实现,刚开始使用的是queue<int>队列,但是在对步数的保存上出现了问题,这时候我选择了queue<pair <int,int> >来记录位置和步数,每次将n+1,n-1,n*2都压入到队列当中去,直到n==m,结束。程序可以运行,样例的输出答案也是正确的,但是提交的时候MLE了,这让我明白了剪枝的重要性,最后程序在两个方面进行了剪枝,一个是建立一个标记数组,对搜索到的每一点都进行标记,避免重复搜索,第二就是对于n>m的情况,毫无疑问应该采取n-1。应用了这两点剪枝策略以后,成功A掉。
代码:#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
const int maxn=4e5+5;
int n,m;
queue<pair<int,int> >q;
bool hash[maxn];
int main()
{
    int m,n;
  while(cin>>n>>m)
  {
    memset(hash,false,sizeof(hash));
    pair<int,int> p;
    p.first=n;
    p.second=0;
    hash[n]=true;
    q.push(p);
    while(!q.empty())
    {
      pair<int,int> a,b;
      a=q.front();
      if(a.first==m)
      {
          cout<<a.second<<endl;
          break;
      }
     a.second++;
     b=a;
     if(b.first>m)
     {
         b.first=a.first-1;
         if(hash[b.first]==false)
         {
           hash[b.first]=true;//标记该点,表示已经走过
           q.push(b);
         }
     }
     if(b.first<m)
     {
         b.first=a.first+1;
         if(hash[b.first]==false)
         {
           hash[b.first]=true;//标记该点,表示已经走过
           q.push(b);
         }
         b.first=a.first*2;
        if(hash[b.first]==false)
         {
           hash[b.first]=true;
           q.push(b);
         }
         b.first=a.first-1;
         if(hash[b.first]==false)
         {
           hash[b.first]=true;
           q.push(b);
         }
     }
     q.pop();//弹出队列第一个元素
    }
    while(!q.empty())
        q.pop();//注意清空队列
  }
    return 0;
}
梦想起航!加油!

poj3278 BFS入门的更多相关文章

  1. HDU1548- A strange lift (BFS入门)

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1548 A Strrange lift Time Limit: 2000/1000 MS (Java/ ...

  2. POJ-3278(BFS)

    题目:                                                                                                 ...

  3. POJ 3278 抓奶牛(BFS入门题)

    描述 农夫约翰已被告知逃亡牛的位置,并希望立即抓住她.他开始于一个点Ñ(0≤ Ñ ≤100,000)上的数线和牛是在点ķ(0≤ ķ上相同数目的线≤100,000).农夫约翰有两种交通方式:步行和传送. ...

  4. hdu 1242 Rescue(BFS入门)

    第一次用容器做的BFS题目,题目有个地方比较坑,就是遍历时的方向,比如上下左右能AC,右上左下就WA #include <stdio.h> #include <string.h> ...

  5. BFS入门

    #include<iostream> #include<cstring> #include<queue> using namespace std; #define ...

  6. 抓住那只牛!Catch That Cow POJ-3278 BFS

    题目链接:Catch That Cow 题目大意 FJ丢了一头牛,FJ在数轴上位置为n的点,牛在数轴上位置为k的点.FJ一分钟能进行以下三种操作:前进一个单位,后退一个单位,或者传送到坐标为当前位置两 ...

  7. HDU2717-Catch That Cow (BFS入门)

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2717 Catch That Cow Time Limit: 5000/2000 MS (Java/O ...

  8. POJ 3278 Catch That Cow[BFS+队列+剪枝]

    第一篇博客,格式惨不忍睹.首先感谢一下鼓励我写博客的大佬@Titordong其次就是感谢一群大佬激励我不断前行@Chunibyo@Tiancfq因为室友tanty强烈要求出现,附上他的名字. Catc ...

  9. poj3278 【BFS】

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 97240   Accepted: 30519 ...

随机推荐

  1. 非主窗体在任务栏显示按钮(简单好用)good

    非主窗体在任务栏显示按钮 type TForm2 = class(TForm) private { Private declarations } public { Public declaration ...

  2. 【HDOJ】5179 beautiful number

    DFS. /* 5179 */ #include <iostream> #include <algorithm> #include <map> #include & ...

  3. Linux下高并发网络编程

      Linux下高并发网络编程 1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时, 最高的并发数量都要受到系统对用户单一进程同时可打 ...

  4. Linux on Power 上的调试工具和技术

     Linux on Power 上的调试工具和技术 简介: 调试是一项主要的软件开发活动,作为应用程序开发人员,您无法避免对程序进行调试.有效的调试不仅能缩短软件开发周期,而且可以节省成本.本文简要介 ...

  5. vijos1082丛林探险

    P1082丛林探险 描述 东非大裂谷中有一片神秘的丛林,是全世界探险家的乐园,著名黄皮肤探险家BB一直想去试试.正好我国科学家2005年4月将首次对东非大裂谷进行科考,BB决定随科考队去神秘丛林探险. ...

  6. Ubuntu 14.04 Remmina远程桌面连接Windows计算机

    可以在/usr/share/applications/目录下启动Remmina远程桌面客户端或者直接在Dash中搜索Remmina即可 启动后如下图,可以新建,复制,编辑,删除远程桌面客户端 选择新建 ...

  7. 网络流(二分):BZOJ 3993: [SDOI2015]星际战争

    Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈 地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai.当一个巨型 ...

  8. Andriod视频http://pan.baidu.com/share/link?shareid=7300&uk=3339495714

    老罗Android开发 视频教程           一.Android入门介绍 视频教程     1.1 android系统介绍   1.3 如何搭建android开发环境   1.5 androi ...

  9. C# 匿名方法 委托 Action委托 Delegate委托

    原文地址:https://msdn.microsoft.com/zh-cn/library/bb882516.aspx 匿名函数是一个“内联”语句或表达式,可在需要委托类型的任何地方使用. 可以使用匿 ...

  10. [Audio processing] wav音频文件读取int和double数组的关系

    直接读取wav文件是int数组,但是有一些实现返回的是double数组,还有些输入是double数组:那我们要互相调用的时候还是要看看两者到底有什么关系,其实很简单. 以单身道,16bit为例 /** ...