广度优先遍历(Breadth First Search,BFS)是一个分层的搜索过程,没有回退过程,是非递归的。

DFS与BFS的小秘密:

1、深度优先搜索算法的思路很简单,比较好理解,但得到的解不是最优的;而广度优先搜索则恰恰相反;

2、如果节点有无穷多个,深度优先搜索算法在某处分支可以无限搜索下去却找不到解,这时我们可以采用有界深度优先搜索~

题目来源:

ZOJ Monthly,October 2003,ZOJ1649

题目描述:

Angel被MOLIGPY抓住了,她被关在监狱里。监狱可以用一个N*M的矩阵来描述,1<N、M<=200。监狱由N*M个格子组成,每个方格中可能为墙壁、道路、警卫、Angel或Angel的朋友。Angel的朋友想去营救Angel。他的任务是接近Angel。约定“接近Angel”的意思是到达Angel被关的位置。如果Angel的朋友想到达某个方格,但方格中有警卫,那么必须杀死警卫,才能到达这个方格。假定Angel的朋友向上、下、左、右移动一步用时1个单位时间,杀死警卫也用时1个单位时间。假定Angel的朋友可以杀死所有警卫。

试计算Angel的朋友接近Angel至少需要多长时间,只能向上、下、左、右移动,而且墙壁不能通过。

输入描述:

输入文件中包含多个测试数据。每个测试数据的第1行为两个整数N和M,接下来有N行,每行有M个字符:"."代表道路,"a"代表Angel,"r"代表Angel的朋友,"#"代表墙壁,"x"代表警卫。

输出描述:

对每组测试数据,输出一个整数,表示接近Angel所需最少时间。如果无法接近Angel,则输出"Poor ANGEL has to stay in the prison all his life."。

样例输入:

7 8

#.#####.

#a.#xr..

#.x#xx..

..xxxx.#

#.......

.#......

........

样例输出:

12

闲话少叙,奉上代码+注释~

Code:

[cpp] view plaincopyprint?
  1. #include<iostream>
  2. #include<queue>
  3. using namespace std;
  4. #define MAXN 200
  5. #define INF 1000000
  6. struct point
  7. {
  8. int x, y;               //记录点的坐标
  9. int step;               //记录到达当前点所用步数
  10. int time;               //记录到达当前点所用时间
  11. };
  12. queue<point>Q;                //想法:用队列存储BFS遍历的节点,队头为当前所处位置,把所有遍历到新的节点插入队尾
  13. char map[MAXN][MAXN];       //地图
  14. int mintime[MAXN][MAXN];    //到达每个点所用时间
  15. int dir[4][2] = { {-1, 0}, {0, 1}, {1, 0}, {0, -1} };   //四个方向:上右下左
  16. int N, M;                   //监狱的大小
  17. int ax, ay;                 //Angel所在位置
  18. int BFS(point start)
  19. {
  20. int i;
  21. Q.push(start);          //将顶点入队
  22. point head;             //定义一个当前点
  23. while(!Q.empty())
  24. {
  25. head = Q.front();   //获取队头点,即当前点
  26. Q.pop();            //获取后随即弹出,为后面的操作做预处理
  27. for(i = 0; i < 4; i++)
  28. {
  29. int x = head.x + dir[i][0], y = head.y + dir[i][1];     //获取下一个方向上的坐标
  30. if(x>=0 && x<N && y>=0 && y<M && map[x][y] != '#')      //排除越界和墙壁的情况
  31. {   //获取下一个点的全部信息
  32. point next;
  33. next.x = x;
  34. next.y = y;
  35. next.step = head.step + 1;
  36. next.time = head.time + 1;
  37. if(map[x][y] == 'x') next.time++;   //如果遇到敌人,多消耗一个时间
  38. //比较时间,选择用时最短的位置入队并作为下一次遍历的起点~
  39. if(next.time < mintime[x][y])
  40. {//此处有两个作用:1、比较哪个路径对应的时间最小,并入队;2、标记上一个点,使其不可回退。
  41. mintime[x][y] = next.time;
  42. Q.push(next);
  43. }
  44. }
  45. }
  46. }
  47. return mintime[ax][ay];
  48. }
  49. int main()
  50. {
  51. int i, j;
  52. int fx, fy;     //Angel的朋友的坐标
  53. while(scanf("%d%d", &N, &M) != EOF)
  54. {
  55. memset(map, 0, sizeof(map));        //初始化大地图
  56. for(i = 0; i < N; i++) scanf("%s", map[i]);      //确立监狱信息
  57. for(i = 0; i < N; i++)
  58. for(j = 0; j < M; j++)
  59. {
  60. mintime[i][j] = INF;        //初始化时间为无穷大
  61. if(map[i][j] == 'r') { fx = i; fy = j; }
  62. else if(map[i][j] == 'a') { ax = i; ay = j; }
  63. }
  64. point start;
  65. start.x = fx; start.y = fy;
  66. start.step = start.time = 0;
  67. mintime[fx][fy] = 0;
  68. int mint = BFS(start);
  69. if(mint < INF) printf("%d\n", mint);
  70. else printf("Poor ANGEL has to stay in the prison all his life.\n");
  71. }
  72. return 0;
  73. }

运行结果:

Ps:如有Bug,欢迎拍砖~

实现BFS之“营救”相关推荐

  1. 【BFS】营救铁达尼号(C++)

    Description 铁塔尼号遇险了!他发出了求救信号.距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里.通过侦测,哥伦比亚号获取了一张海洋图.这张图将海洋部分分化成n*n个比较小的单 ...

  2. 1689: 营救小明(bfs+priority_queue逆向思维)

    1689: 营救小明 时间限制: 1 Sec 内存限制: 32 MB [提交][状态][讨论版] 题目描述 一天,小明梦见自己被外星人抓走了,他被关在了一座监狱里,这座监狱形如N*M(N,M<= ...

  3. hrbust 哈理工oj 1989 营救小组【BFS】

    营救小组 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 181(39 users) Total Accepted: 46(35 use ...

  4. 洛谷 - P4011 孤岛营救问题(bfs+状态压缩)

    题目链接:点击查看 题目大意:给出一个n*m的迷宫,其中有一些边为不可逾越的墙,有一些边为不同型号的门,而钥匙会分布在迷宫的不同位置,求从点(1,1)到点(n,m)的最短时间 题目分析:出现在网络流里 ...

  5. [BFS]营救营救铁达尼号-C++

    Description 铁塔尼号遇险了!他发出了求救信号.距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里.通过侦测,哥伦比亚号获取了一张海洋图.这张图将海洋部分分化成n*n个比较小的单 ...

  6. XJOI 3585 The rescue plan 营救计划 题解

    英文 Time Limit:1s Memory Limit:256M Description Given a n*m map.A "Mengxin" is trapped.You ...

  7. 孤岛营救与汽车加油行驶问题

    题目链接:https://www.luogu.org/problemnew/show/P4011 (孤岛营救)|| https://www.luogu.org/problemnew/show/P400 ...

  8. P4011 孤岛营救问题

    P4011 孤岛营救问题 文章目录 输入输出样例 题意: 题解: 代码: 输入输出样例 输入 4 4 9 9 1 2 1 3 2 1 2 2 2 0 2 1 2 2 0 2 1 3 1 0 2 3 3 ...

  9. [网络流24题-6]孤岛营救问题

    孤岛营救问题 为什么又是奇奇怪怪的混进来的题啊QAQ 又没想出网络流解法啊QAQ 看见P是10就又状压了吖QwQ bfs跑一遍就吼了w 为啥子网络流24题总是状压+最短路/bfs啊QAQ 哦对记得门和 ...

最新文章

  1. 清华副校长杨斌 :“祛魅”, 科技创新需要避免教育“人性”缺失
  2. 滴滴笔试编程题第一题
  3. win10中的ubuntu子系统忘记root密码如何修改
  4. 使用VirtualBox SDK之初步编译
  5. linux软件可以在所有发行版运行吗,Linux通用的跨发行版的3大软件包管理器
  6. 作为前端应当了解的Web缓存知识
  7. Python操作Excel删除一个Sheet
  8. 2020 Oracle JDK下载
  9. javascript 原生事件综合查询
  10. KVM的概念和云计算
  11. Spark中的python shell交互界面Ipython和jupyter notebook
  12. WAP技术入门(上)
  13. word压缩软件,免费
  14. 用混淆矩阵计算kappa系数
  15. LBS服务LevelUp推二维码支付产品
  16. Burpsuite配置抓apk流量代理设置脚本
  17. php如何把线条变粗,科学网—AutoCAD线条加粗秘诀(转载收藏) - 顿玉环的博文...
  18. Linux下学习C语言编程(一)系统环境配置
  19. CF B. Sonya and Exhibition
  20. Android——透明色

热门文章

  1. 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表混淆 | resources.arsc 资源映射表二进制格式分析 | 混淆全局字符串池和资源名称字符串池 )
  2. 【Android 安全】DEX 加密 ( Application 替换 | 分析 ContentProvider 组件中调用 getApplication() 获取的 Application 二 )
  3. 【组合数学】递推方程 ( 常系数线性非齐次递推方程求解 | 递推方程标准型及通解 | 递推方程通解证明 )
  4. 【Android 内存优化】Bitmap 图像尺寸缩小 ( 考虑像素密度、针对从不同像素密度资源中解码对应的 Bitmap 对象 | inDensity | inTargetDensity )
  5. [Spring cloud 一步步实现广告系统] 19. 监控Hystrix Dashboard
  6. PIE_SDK.NET功能表
  7. 微信小程序 wx:key 提示-解决
  8. 使用nginx缓存服务器上的静态文件
  9. 【读书笔记】简约至上-交互式设计四策略
  10. iOS.Animations.by.Tutorials.v2.0汉化