Uvaoj 11624 - Fire!
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!相关推荐
- 【POJ3126 Prime Path】【POJ 3087 Shuffle'm Up】【UVA 11624 Fire!】【POJ 3984 迷宫问题】
POJ3126Prime Path 给定两个四位素数a b,要求把a变换到b 变换的过程要 每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数 与 前一步得到的素数 只能有一个位 ...
- BFS(两点搜索) UVA 11624 Fire!
题目传送门 1 /* 2 BFS:首先对火搜索,求出火蔓延到某点的时间,再对J搜索,如果走到的地方火已经烧到了就不入队,直到走出边界. 3 */ 4 /************************ ...
- UVA - 11624 Fire! 两次BFS
UVA - 11624 Fire! Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and ...
- UVA - 11624 - Fire!
题目描述: 小明最后也没能进入游戏大厂,也没能娶到心爱的女孩,现在小明在一家迷宫里工作. 不幸的是,迷宫里因为线路老化而发生了火灾.小明现在需要一个逃跑路线,请你帮助倒霉的小明从迷宫中逃离出去吧 小明 ...
- UVA - 11624 Fire!
题意:求Joe走出迷宫的最短时间,有障碍,还有向四周蔓延的火 思路:将火的位置也加进BFS里面 #include <iostream> #include <cstdio> #i ...
- Fire! UVA - 11624
题目链接:Fire! UVA - 11624 =================================================== Fire Time Limit: 1000MS D ...
- kuangbin带你飞专题合集
题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...
- 算法学习经典例题整理
陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https ...
- FZU 1275和UVA11624
这两个题比较相似,放到一起来整理. FZU 1275 放火烧山 法外狂徒张三在n*m的平地上放火玩,#表示草,张三有分身,他的分身和他本人分别选一个#格子点火,火可以向上向下向左向右在有草的格子蔓延, ...
最新文章
- (C++)类内运算符重载时:此运算符函数的参数太多/少
- 敏捷开发的艺术读书笔记
- httpd tomcat mysql_Linux系统环境下Tomcat8、httpd、mysql8开机自启动配置
- 找出最大值和最小值(算法导论第三版9.1-2)
- 出现一个黑色框按不动_创意 | 这才是走心的衣架设计,给衣服一个高逼格的家!...
- python工资一般多少-Python就业都有哪些岗位?每个岗位薪资多少?
- 怎么就没发现华为Mate20 pro有这么多神奇功能!这波黑科技盘它!
- Flex 学习笔记 ComboBox内容框宽度
- window Jconsole链接到CenOS 监控Tomcat
- VMware Workstation 16.2.2 Pro for Windows SLIC 2.6 Unlocker
- 【路由器】Breed 介绍、刷入和使用
- 绩效考核管理方案文档
- 小米摄像头有onvif协议_小米红米5Plus、小米红米Note7、vivoY3对比
- 计算机提示无法识别优盘,U盘插入电脑提示无法识别的解决方法
- python游戏开发keydown_pygame.KEYDOWN移动对象
- 小srf的游戏 题解
- C语言转义字符'\'
- C#的循环控制语句(break,continue)语句
- EasyNVR网页摄像机直播方案H5前端构建之:区分页面是自跳转还是分享依据
- web网页设计期末课程大作业:动漫主题网站设计——关于我转生史莱姆这件事(6页)HTML+CSS
热门文章
- 管理系统中计算机应用 重点章节,11年《管理系统中计算机应用》 第5章 重点要点.doc...
- gitlab访问慢,出现502,特别卡,耗内存cpu解决办法
- angular图片上传
- rageframe2 数据库配置_RF 微商城 一款基于 RageFrame2 的免费开源的基础销售功能的微商城...
- 感知器算法的基本原理和步骤_很多情况下,深度学习算法和人脑相似
- 折线图x轴的日期会超出_matplotlib之折线图(代码+解析)
- C语言 while 循环 - C语言零基础入门教程
- BugkuCTF-MISC题隐写3
- BugkuCTF-MISC题隐写
- django2连接mysql_Django2.2连接MySQL问题解决