题目大意:

F代表火焰

J代表人

一个人想在火焰烧到自己之前逃出着火地区

. 为路,人可以走,火可以燃烧(当然如果火先烧到就不能走了)

#为墙,不可走

如果能逃出,输出时间,不能,输出IMPOSSIBLE

每次移动上下左右(人火都是, 花费1)

解题思路:

简单广搜两次就行,先对火广搜,保存下步数,在对人广搜,看看走到此点花费的时间是不是比火小,小的话可以走,不然不能走,走到边界为逃出条件

具体实现用一个二维数组F

先对火焰进行广搜,用来保存每个点火燃烧到时花费的步数,初始值为0;
第二次广搜人走到此点需要的步数,如果小于此时此点保存的则证明可以走,走过之后赋值为-1;
火燃烧出发点赋值为-1;

代码:

  1. #include <iostream>
  2. #include <cmath>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cstdio>
  6. #include <algorithm>
  7. #include <vector>
  8. #include <queue>
  9. #include <stack>
  10.  
  11. using namespace std;
  12. #define INF 0xfffffff
  13. #define N 1010
  14. int m, n;
  15. char maps[N][N];
  16. int dir[][] = {,, ,-, ,, -,};
  17. int F[N][N];
  18. /*F, 先对火焰进行广搜,用来保存每个点火燃烧到时花费的步数,初始值为0;
  19. 第二次广搜人走到此点需要的步数,如果小于此时此点保存的则证明可以走,走过之后赋值为-1;
  20. 火燃烧出发点赋值为-1,
  21. */
  22.  
  23. struct node
  24. {
  25. int x, y;
  26. int step;
  27. }s, e, a[N], q1;
  28.  
  29. void Init()//初始化
  30. {
  31. memset(maps, , sizeof(maps));
  32. memset(F, , sizeof(F));
  33. memset(a, , sizeof(a));
  34. }
  35.  
  36. void BFS(int c)
  37. {
  38. queue<node>q;
  39.  
  40. for(int i = ; i < c; i++) {
  41. q.push(a[i]);
  42. F[a[i].x][a[i].y] = -;
  43. }
  44.  
  45. while(q.size()) {//对火焰的广搜
  46. q1 = q.front();
  47. q.pop();
  48.  
  49. for(int i = ; i < ; i++) {
  50. e.x = q1.x + dir[i][];
  51. e.y = q1.y + dir[i][];
  52. e.step = q1.step + ;
  53. if(e.x >= && e.y >= && e.x < m && e.y < n && F[e.x][e.y] == && maps[e.x][e.y] == '.') {
  54. F[e.x][e.y] = e.step;
  55. q.push(e);
  56. }
  57. }
  58. }
  59.  
  60. q.push(s);
  61. F[s.x][s.y] = -;
  62.  
  63. while(q.size()) {//对人的广搜
  64. q1 = q.front();
  65. q.pop();
  66. if(q1.x == || q1.y == || q1.x == m - || q1.y == n - ) {//达到出去条件, 输出到达此地步数+1
  67. printf("%d\n", q1.step + );
  68. return;
  69. }
  70.  
  71. for(int i = ; i < ; i++) {
  72. e.x = q1.x + dir[i][];
  73. e.y = q1.y + dir[i][];
  74. e.step = q1.step + ;
  75. if(c != ){
  76. if(e.x >= && e.y >= && e.x < m && e.y < n && F[e.x][e.y] != - && e.step < F[e.x][e.y] && maps[e.x][e.y] == '.') {
  77. F[e.x][e.y] = -;
  78. q.push(e);
  79. }
  80. }
  81. else if(e.x >= && e.y >= && e.x < m && e.y < n && F[e.x][e.y] != - && maps[e.x][e.y] == '.') {
  82. F[e.x][e.y] = -;
  83. q.push(e);
  84. }
  85. }
  86.  
  87. }
  88.  
  89. printf("IMPOSSIBLE\n");//未满足条件
  90.  
  91. }
  92.  
  93. int main()
  94. {
  95. int T;
  96. scanf("%d", &T);//T个样例
  97.  
  98. while(T--) {
  99. Init();//初始化
  100. int c = ;
  101. scanf("%d %d", &m, &n);
  102. for(int i = ; i < m; i++) {
  103. scanf(" ");
  104. for(int j = ; j < n; j++) {
  105. scanf("%c", &maps[i][j]);
  106. if(maps[i][j] == 'F') {//读入数据同时进行初始化 保存人和火焰的下标
  107. a[c].x = i;
  108. a[c].y = j;
  109. a[c++].step = ;
  110. }
  111. if(maps[i][j] == 'J') {
  112. s.x = i;
  113. s.y = j;
  114. s.step = ;
  115. }
  116. }
  117. }
  118. BFS(c);//开广搜
  119.  
  120. }
  121. }
  122. /*
  123. 2
  124. 4 4
  125. ####
  126. #J.#
  127. #..#
  128. #..#
  129. 3 3
  130. ###
  131. #J.
  132. #.F
  133. */

UVA 11624 Fire!的更多相关文章

  1. UVa 11624 Fire!(着火了!)

    UVa 11624 - Fire!(着火了!) Time limit: 1.000 seconds Description - 题目描述 Joe works in a maze. Unfortunat ...

  2. BFS(两点搜索) UVA 11624 Fire!

    题目传送门 /* BFS:首先对火搜索,求出火蔓延到某点的时间,再对J搜索,如果走到的地方火已经烧到了就不入队,直到走出边界. */ /******************************** ...

  3. UVA - 11624 Fire! bfs 地图与人一步一步先后搜/搜一次打表好了再搜一次

    UVA - 11624 题意:joe在一个迷宫里,迷宫的一些部分着火了,火势会向周围四个方向蔓延,joe可以向四个方向移动.火与人的速度都是1格/1秒,问j能否逃出迷宫,若能输出最小时间. 题解:先考 ...

  4. UVA 11624 - Fire! 图BFS

    看题传送门 昨天晚上UVA上不去今天晚上才上得去,这是在维护么? 然后去看了JAVA,感觉还不错昂~ 晚上上去UVA后经常连接失败作死啊. 第一次做图的题~ 基本是照着抄的T T 不过搞懂了图的BFS ...

  5. UVA 11624 Fire!(广度优先搜索)

    题目大意:在一个N*M的迷宫内,J代表某人(只有一个),F代表火(可能不只一个),#代表墙,火每分钟会向四周除了墙以外的地方扩散一层,问人能否在没被火烧到 之前逃出迷宫,若能逃出输出最短时间.很明显的 ...

  6. UVa 11624 Fire!(BFS)

    Fire! Time Limit: 5000MS   Memory Limit: 262144KB   64bit IO Format: %lld & %llu Description Joe ...

  7. uva 11624 Fire!(搜索)

    开始刷题啦= = 痛并快乐着,学到新东西的感觉其实比看那些无脑的小说.电视剧有意思多了 bfs裸体,关键是先把所有的着火点放入队列,分开一个一个做bfs会超时的 发现vis[][]是多余的,完全可以用 ...

  8. UVA 11624 Fire! (bfs)

    算法指南白书 分别求一次人和火到达各个点的最短时间 #include<cstdio> #include<cstring> #include<queue> #incl ...

  9. (简单) UVA 11624 Fire! ,BFS。

    Description Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the ow ...

  10. UVA 11624 Fire! bfs 难度:0

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

随机推荐

  1. Python 对目录中的文件进行批量转码(GBK>UTF8)

    通过python实现对文件转码,其实处理很简单: 1.打开读取文件内容到一个字符串变量中,把gbk编码文件,对字符串进行decode转换成unicode 2.然后使用encode转换成utf-8格式. ...

  2. CentOS 安装 Dubbo 管理控制台

    安装之前需要安装zookeeper详情http://www.cnblogs.com/zuge/p/6141101.html Dubbo 管控台可以对注册到 zookeeper 注册中心的服务或服务消费 ...

  3. Android 进程常驻----native保活5.0以上方案推演过程以及代码

    正文: 上一篇我们通过父子进程间建立双管道,来监听进程死掉,经过测试,无耗电问题,无内存消耗问题,可以在设置中force close下成功拉起,也可以在获取到root权限的360/cleanmaste ...

  4. 平时一些mysql小技巧及常识

    >navicat premium 快捷键1.ctrl+q 打开查询窗口2.ctrl+/ 注释sql语句3.ctrl+shift +/ 解除注释4.ctrl+r 运行查询窗口的sql语句5.ctr ...

  5. C#中浮点数依IEEE-754标准转二进制串 (MODBUS 浮点数转换)

    因工作需要,把再串口通信中浮点数与字节流的数据转换函数放在这,转发的,谢谢原作者. 今天花了一天的时间搜罗资料,为了解决一个串口编程的进制转化问题.因为串口传送的浮点数据格式与IEEE-754标准(3 ...

  6. CentOS 7 最小化安装的无线网络配置

    1.首先下载iw工具. yum -y install iw 2.获取无线网卡的名称 执行iw dev,假设获得名称为 wlp3s0(示例) 3.激活无线网络接口 执行ip link set wlp3s ...

  7. webpack配置命令

    从2015年开始,webpack就是当前最火的构建工具.跟着时代向前走.准没错.我们要追随大神的脚步.走在前端技术栈的前列.大神等等我. 由于webpack是基于nodejs环境下的.所以先安装nod ...

  8. 剑指offer五:

    输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. /* public class ListNode { int val; ListNode next = n ...

  9. PCA9554

    参考资料: 1. Texas Instruments PCA9554简介 2. PCA9554文档下载 3. PCA9554 Data Sheet 知识点: ● PCA9554是具有中断输出和配置寄存 ...

  10. 【所见即所得】textarea 精确限制字数、行数,中、英、全半角混检 。源码带注释

    主要解决难点: 1 中文 全角2字符深深的恶意 2 多行输入textarea 手动,自动换行问题 3 获得每行内容 原创,转载请注明出处! <!DOCTYPE html PUBLIC " ...