UVa 11624 Fire!(BFS)
Time Limit: 5000MS | Memory Limit: 262144KB | 64bit IO Format: %lld & %llu |
Description
Given Joe's location in the maze and which squares of the maze are on fire, you must determine whether Joe can exit the maze before the fire reaches him, and how fast he can do it.
Joe and the fire each move one square per minute, vertically or horizontally (not diagonally). The fire spreads all four directions from each square that is on fire. Joe may exit the maze from any square that borders the edge of the maze. Neither Joe nor the
fire may enter a square that is occupied by a wall.
Input
and each of these characters is one of:
- #, a wall
- ., a passable square
- J, Joe's initial position in the maze, which is a passable square
- F, a square that is on fire
There will be exactly one J in the input.
Output
Sample Input
- Case #1:
- 4 4
- ####
- #JF#
- #..#
- #..#
- Case #2:
- 3 3
- ###
- #J.
- #.F
Sample Output
- 3
- IMPOSSIBLE
Source
题目本身不难,但是很容易WA,两个坑点:一开始就在边界的情况和火堆根本碰不到人的情况,第一种稍微把BFS判断顺序改一下就可以了,第二种会导致比较人和火谁先跑出迷宫这种BFS方法WA,可以假设若火根本碰不到人,那么就算火跑的比香港记者更快,那人还是可以走出去的,然后怎么保证每一个地方都是最早被火碰到的呢?把所有的火都压入队列一次性BFS掉,这样保证层数相同时时间可以统一更新,因此要用另一种保险的BFS方法,把每一个点时间设好,再对人进行BFS,被这两个坑点弄的WA十余次………哎还是too
naive。找了个只是输出格式修改了的题面放上去,方便起见自己把输出格式也改成了原题一样的……
代码:
- #include<iostream>
- #include<algorithm>
- #include<cstdlib>
- #include<sstream>
- #include<cstring>
- #include<cstdio>
- #include<string>
- #include<deque>
- #include<stack>
- #include<cmath>
- #include<queue>
- #include<set>
- #include<map>
- using namespace std;
- #define INF 0x3f3f3f3f
- #define MM(x,y) memset(x,y,sizeof(x))
- #define LC(x) (x<<1)
- #define RC(x) ((x<<1)+1)
- #define MID(x,y) ((x+y)>>1)
- typedef pair<int,int> pii;
- typedef long long LL;
- const double PI=acos(-1.0);
- const int N=1010;
- struct info
- {
- int x;
- int y;
- int t;
- info operator+(info b)
- {
- b.x+=x;
- b.y+=y;
- b.t+=t;
- return b;
- }
- };
- info J,F,direct[4]={{1,0,1},{-1,0,1},{0,1,1},{0,-1,1}};
- char pos[N][N];
- int firetime[N][N];
- int vis[N][N];
- int n,m;
- queue<info>Q;
- inline bool checkfire(const info &f)
- {
- return (f.x>=0 && f.x<n && f.y>=0 && f.y<m && pos[f.x][f.y]!='#' && vis[f.x][f.y]==0);
- }
- inline bool checkman(const info &a)
- {
- return (a.x>=0 && a.x<n && a.y>=0 && a.y<m && pos[a.x][a.y]!='#' && pos[a.x][a.y]!='F' && vis[a.x][a.y]==0);
- }
- inline void init()
- {
- MM(pos,0);
- MM(firetime,INF);
- J.x=-1,J.y=-1,J.t=-1;
- while (!Q.empty())
- Q.pop();
- }
- inline void setfire()
- {
- MM(vis,0);
- while (!Q.empty())
- {
- info now=Q.front();
- Q.pop();
- for (int i=0; i<4; ++i)
- {
- info v=now+direct[i];
- if(checkfire(v))
- {
- vis[v.x][v.y]=1;
- firetime[v.x][v.y]=v.t;
- Q.push(v);
- }
- }
- }
- }
- inline int run(const info &s)
- {
- MM(vis,0);
- queue<info>q;
- vis[s.x][s.y]=1;
- q.push(s);
- while (!q.empty())
- {
- info now=q.front();
- q.pop();
- if(now.x==0||now.x==n-1||now.y==0||now.y==m-1)
- return now.t;
- for (int i=0; i<4; ++i)
- {
- info v=now+direct[i];
- if(checkman(v)&&v.t<firetime[v.x][v.y])
- {
- vis[v.x][v.y]=1;
- q.push(v);
- }
- }
- }
- return -1;
- }
- int main(void)
- {
- int tcase,i,j,out,cnt;
- scanf("%d",&tcase);
- while (tcase--)
- {
- init();
- cnt=0;
- out=-1;
- scanf("%d%d",&n,&m);
- for (i=0; i<n; ++i)
- {
- scanf("%s",pos[i]);
- for (j=0; j<m; ++j)
- {
- if(pos[i][j]=='J')
- {
- J.x=i;
- J.y=j;
- J.t=0;
- }
- else if(pos[i][j]=='F')
- {
- F.x=i;
- F.y=j;
- F.t=0;
- Q.push(F);
- }
- }
- }
- setfire();
- out=run(J);
- out==-1?puts("IMPOSSIBLE"):printf("%d\n",out+1);
- }
- return 0;
- }
UVa 11624 Fire!(BFS)的更多相关文章
- uva 11624 Fire!(搜索)
开始刷题啦= = 痛并快乐着,学到新东西的感觉其实比看那些无脑的小说.电视剧有意思多了 bfs裸体,关键是先把所有的着火点放入队列,分开一个一个做bfs会超时的 发现vis[][]是多余的,完全可以用 ...
- UVa 11624 Fire!(着火了!)
UVa 11624 - Fire!(着火了!) Time limit: 1.000 seconds Description - 题目描述 Joe works in a maze. Unfortunat ...
- UVA 11624 - Fire! 图BFS
看题传送门 昨天晚上UVA上不去今天晚上才上得去,这是在维护么? 然后去看了JAVA,感觉还不错昂~ 晚上上去UVA后经常连接失败作死啊. 第一次做图的题~ 基本是照着抄的T T 不过搞懂了图的BFS ...
- UVA 11624 Fire!(两次BFS+记录最小着火时间)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- UVA - 11624 J - Fire! (BFS)
题目传送门 J - Fire! Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the ...
- UVA 11624 Fire!(广度优先搜索)
题目大意:在一个N*M的迷宫内,J代表某人(只有一个),F代表火(可能不只一个),#代表墙,火每分钟会向四周除了墙以外的地方扩散一层,问人能否在没被火烧到 之前逃出迷宫,若能逃出输出最短时间.很明显的 ...
- (简单) UVA 11624 Fire! ,BFS。
Description Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the ow ...
- UVA - 11624 Fire! 【BFS】
题意 有一个人 有一些火 人 在每一秒 可以向 上下左右的空地走 火每秒 也会向 上下左右的空地 蔓延 求 人能不能跑出来 如果能 求最小时间 思路 有一个 坑点 火是 可能有 多处 的 样例中 只有 ...
- UVA - 11624 Fire! 双向BFS追击问题
Fire! Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of ...
随机推荐
- 前端代理nproxy
一.场景/用途 前端代理的用途,相信大家都清楚.应用场景很多,如—— . 将线上的静态资源文件(JS.CSS.图片)替换为本地相应的文件,来调试线上(代码都被压缩过)的问题: . 本地开发过程,当后端 ...
- Oracle Undo与脏读解析
Undo就是用来记录保存事务操作过程中的数据,如果事务发生错误,可以之前的数据进行填补. Undo segment 是保存在表空间上的.Undo 大小是固定的,既然是固定的也就是有限的.如果保存的记录 ...
- hdu 1159:Common Subsequence(动态规划)
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- Mongodb安装(Mac平台)
1安装: sudo brew install mongodb 2 启动MongoDb sudo mongod —config /usr/local/etc/mongod.conf 3.登录mongo ...
- [译]ASP.NET 性能监控
概述:在性能测试中性能监视器是非常强大的工具,本文主要简述了几个关键的计数器和相关的阈值. 监控性能计数器 很多的性能计数器在性能调优中是非常重要的,由于性能计数器太多,很多人不知道选择那些计数器. ...
- HTML5标准学习 – DOCTYPE
转自:http://www.cnblogs.com/GrayZhang/archive/2011/03/31/learning-html5-doctype.html 上一篇文章主要讲述了HTML文档的 ...
- 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)码农网
12. 安装 Apache Tomcat Tomcat 是由 Apache 设计的用来运行 Java HTTP web 服务器的 servlet 容器.按照下面的方法安装 tomcat,但需要指出的是 ...
- Android UDP
一.UDP协议全称是用户数据报协议 ,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议. 1.UDP是一个无连接协议,传输数据之前源端和终端不建立连接: 2.不维护连接状态,包括收发状态等 ...
- error opening trace file: No such file or directory (2) ,can't load transform_config.xml
出现这个错误:error opening trace file: No such file or directory (2) ,can't load transform_config.xml 是因为没 ...
- hive复杂类型与java类型的对应
因为要往自定义的UDF传入复杂类型,所以需要对于这块的对应简单做一下总结 string java.lang.String, org.apache.hadoop.io.Text int int, jav ...