1 /*************************************************************************
  2     > File Name: test.cpp
  3     > Author: HJZ
  4     > Mail: 2570230521@qq.com
  5     > Created Time: 2014年08月03日 星期日 07时26分58秒
  6  ************************************************************************/
  7
  8 /*
  9    题目大意:一个人joe想从迷宫中逃脱,但是迷宫中有着火的地方!joe每分钟向上下左右其中一个方向走一步,当然有火的地方和有墙的地方是不能通过的!
 10    另外,火的蔓延的方向是同一时刻向上下左右四个方向蔓延!
 11
 12    思路:每一时刻,先将火的蔓延位置标记出来,并将新的火的位置放入队列qf中;
 13    因为某一时刻,我们将所有joe可能走的路径都放入了队列中了,假如t1时刻他能走的位置是5个,那么在t1+1时刻,根据上一时刻t1的可能位置更新t1+1
 14    时刻的可能位置,t1时刻的位置出队列q, t1+1时刻的新位置并重新进入队列!
 15 */
 16
 17 #include <queue>
 18 #include <string>
 19 #include <cstdio>
 20 #include <cstring>
 21 #include <iostream>
 22 #include <iomanip>
 23 #include<cmath>
 24 #include <algorithm>
 25 #include<queue>
 26 #define M 1005
 27 #define mem(a) (memset((a), 0, sizeof(a)))
 28 #define get(s) fgets(s, sizeof(s)-1, stdin)
 29
 30 using namespace std;
 31
 32 char map[M][M];
 33 int n, m;
 34 int bg, ed;
 35 int dir[4][2]={1, 0, 0, 1, -1, 0, 0, -1};
 36
 37 struct Point{
 38    int x, y, step;
 39    Point(){
 40
 41    }
 42    Point(int x, int y, int step){
 43       this->x=x;
 44       this->y=y;
 45       this->step=step;
 46    }
 47 };
 48 queue<Point>q; queue<Point>qf;
 49 int cntF;//某一时刻,火点的位置进入队列的个数
 50 int cntP;//某一时刻,joe可走位置进入队列的个数
 51
 52 int bfs(){
 53    while(!q.empty()) q.pop();
 54    q.push(Point(bg, ed, 1));
 55    while(1){
 56       while(!qf.empty() && cntF){
 57          Point  Fcur=qf.front();
 58          qf.pop();
 59          --cntF;
 60          int x=Fcur.x, y=Fcur.y;
 61          for(int i=0; i<4; ++i){
 62             int xx=x+dir[i][0];
 63             int yy=y+dir[i][1];
 64             if(map[xx][yy]!='F' && map[xx][yy]!='#'){
 65                map[xx][yy]='F';
 66                qf.push(Point(xx, yy, 0));
 67             }
 68          }
 69       }
 70       cntF=qf.size();
 71       while(!q.empty() && cntP){
 72             Point cur=q.front();
 73          q.pop(); --cntP; int x=cur.x, y=cur.y;
 74         if(x==1 || x==n || y==1 || y==m) return cur.step;
 75         for(int i=0; i<4; ++i){
 76           int xx=x+dir[i][1];
 77           int yy=y+dir[i][0];
 78           if(map[xx][yy]!='#' && map[xx][yy]!='F' && map[xx][yy]!='X'){
 79               map[xx][yy]='X';
 80               if(x==1 || x==n || y==1 || y==m) return cur.step+1;
 81               q.push(Point(xx, yy, cur.step+1)); } } }
 82           cntP=q.size();
 83       if(cntP==0)  return -1;
 84    }
 85    return -1;
 86 }
 87
 88 int main(){
 89    int t;
 90    scanf("%d", &t);
 91    while(t--){
 92       scanf("%d%d", &n, &m);
 93       for(int i=0; i<=n+1; ++i)
 94          map[i][0]=map[i][m+1]='#';
 95       for(int i=0; i<=m+1; ++i)
 96          map[0][i]=map[n+1][i]='#';
 97
 98       while(!qf.empty())  qf.pop();
 99       cntF=0;
100       cntP=1;
101           for(int j=0, i=1; i<=n; ++i){
102          scanf("%s", map[i]+1);
103          for(j=1; j<=m; ++j)
104             if(map[i][j]=='J'){
105                 bg=i;
106                 ed=j;
107             }
108             else if(map[i][j]=='F'){
109                 ++cntF;
110                 qf.push(Point(i, j, 0));
111             }
112          map[i][j]='#';
113       }
114
115         int tt=bfs();
116         if(tt!=-1)
117            printf("%d\n", tt);
118         else printf("IMPOSSIBLE\n");
119    }
120    return 0;
121 }

转载于:https://www.cnblogs.com/hujunzheng/p/3888581.html

Uvaoj 11624 - Fire!相关推荐

  1. 【POJ3126 Prime Path】【POJ 3087 Shuffle'm Up】【UVA 11624 Fire!】【POJ 3984 迷宫问题】

    POJ3126Prime Path 给定两个四位素数a  b,要求把a变换到b 变换的过程要 每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数  与  前一步得到的素数  只能有一个位 ...

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

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

  3. UVA - 11624  Fire! 两次BFS

    UVA - 11624  Fire! Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and ...

  4. UVA - 11624 - Fire!

    题目描述: 小明最后也没能进入游戏大厂,也没能娶到心爱的女孩,现在小明在一家迷宫里工作. 不幸的是,迷宫里因为线路老化而发生了火灾.小明现在需要一个逃跑路线,请你帮助倒霉的小明从迷宫中逃离出去吧 小明 ...

  5. UVA - 11624 Fire!

    题意:求Joe走出迷宫的最短时间,有障碍,还有向四周蔓延的火 思路:将火的位置也加进BFS里面 #include <iostream> #include <cstdio> #i ...

  6. Fire! UVA - 11624

    题目链接:Fire! UVA - 11624 =================================================== Fire Time Limit: 1000MS D ...

  7. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

  8. 算法学习经典例题整理

    陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https ...

  9. FZU 1275和UVA11624

    这两个题比较相似,放到一起来整理. FZU 1275 放火烧山 法外狂徒张三在n*m的平地上放火玩,#表示草,张三有分身,他的分身和他本人分别选一个#格子点火,火可以向上向下向左向右在有草的格子蔓延, ...

最新文章

  1. (C++)类内运算符重载时:此运算符函数的参数太多/少
  2. 敏捷开发的艺术读书笔记
  3. httpd tomcat mysql_Linux系统环境下Tomcat8、httpd、mysql8开机自启动配置
  4. 找出最大值和最小值(算法导论第三版9.1-2)
  5. 出现一个黑色框按不动_创意 | 这才是走心的衣架设计,给衣服一个高逼格的家!...
  6. python工资一般多少-Python就业都有哪些岗位?每个岗位薪资多少?
  7. 怎么就没发现华为Mate20 pro有这么多神奇功能!这波黑科技盘它!
  8. Flex 学习笔记 ComboBox内容框宽度
  9. window Jconsole链接到CenOS 监控Tomcat
  10. VMware Workstation 16.2.2 Pro for Windows SLIC 2.6 Unlocker
  11. 【路由器】Breed 介绍、刷入和使用
  12. 绩效考核管理方案文档
  13. 小米摄像头有onvif协议_小米红米5Plus、小米红米Note7、vivoY3对比
  14. 计算机提示无法识别优盘,U盘插入电脑提示无法识别的解决方法
  15. python游戏开发keydown_pygame.KEYDOWN移动对象
  16. 小srf的游戏 题解
  17. C语言转义字符'\'
  18. C#的循环控制语句(break,continue)语句
  19. EasyNVR网页摄像机直播方案H5前端构建之:区分页面是自跳转还是分享依据
  20. web网页设计期末课程大作业:动漫主题网站设计——关于我转生史莱姆这件事(6页)HTML+CSS

热门文章

  1. 管理系统中计算机应用 重点章节,11年《管理系统中计算机应用》 第5章 重点要点.doc...
  2. gitlab访问慢,出现502,特别卡,耗内存cpu解决办法
  3. angular图片上传
  4. rageframe2 数据库配置_RF 微商城 一款基于 RageFrame2 的免费开源的基础销售功能的微商城...
  5. 感知器算法的基本原理和步骤_很多情况下,深度学习算法和人脑相似
  6. 折线图x轴的日期会超出_matplotlib之折线图(代码+解析)
  7. C语言 while 循环 - C语言零基础入门教程
  8. BugkuCTF-MISC题隐写3
  9. BugkuCTF-MISC题隐写
  10. django2连接mysql_Django2.2连接MySQL问题解决