(简单) UVA 11624 Fire! ,BFS。
Description
Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of the maze neglected to create a fire escape plan. Help Joe escape the maze.
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.
题目就是迷宫问题,然后加了火,不过这个题被坑了,原来火不只是一个,可以有很多个。。。
这个题先从火BFS一遍,这样就可以知道火多长时间后烧到某一块,然后从人BFS,当走到这时火已经烧过来的话就算不能通过就好了。
代码如下:
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<queue>
- #include<cmath>
- using namespace std;
- bool map1[][];
- int rem[][];
- int Frem[][];
- int N,M;
- int Si,Sj,Fi[],Fj[];
- int cou;
- bool judge(int x,int y,int temp)
- {
- if(x<=||y<=||x>N||y>M)
- return ;
- if(!map1[x][y])
- return ;
- if(rem[x][y])
- return ;
- if(Frem[x][y]>-&&temp>=Frem[x][y])
- return ;
- return ;
- }
- bool judge1(int x,int y)
- {
- if(x<=||y<=||x>N||y>M)
- return ;
- if(!map1[x][y])
- return ;
- if(Frem[x][y]!=-)
- return ;
- return ;
- }
- int slove()
- {
- queue <int> que;
- int temp,t1,t2;
- que.push(Si*+Sj);
- rem[Si][Sj]=;
- while(!que.empty())
- {
- temp=que.front();
- que.pop();
- t1=temp/;
- t2=temp%;
- temp=rem[t1][t2];
- if(t1==||t2==||t1==N||t2==M)
- return temp;
- --t1;
- if(judge(t1,t2,temp))
- {
- que.push(t1*+t2);
- rem[t1][t2]=temp+;
- }
- t1+=;
- if(judge(t1,t2,temp))
- {
- que.push(t1*+t2);
- rem[t1][t2]=temp+;
- }
- --t1;
- --t2;
- if(judge(t1,t2,temp))
- {
- que.push(t1*+t2);
- rem[t1][t2]=temp+;
- }
- t2+=;
- if(judge(t1,t2,temp))
- {
- que.push(t1*+t2);
- rem[t1][t2]=temp+;
- }
- }
- return -;
- }
- void init()
- {
- queue <int> que;
- int temp,t1,t2;
- for(int i=;i<cou;++i)
- {
- que.push(Fi[i]*+Fj[i]);
- Frem[Fi[i]][Fj[i]]=;
- }
- while(!que.empty())
- {
- temp=que.front();
- que.pop();
- t1=temp/;
- t2=temp%;
- temp=Frem[t1][t2];
- --t1;
- if(judge1(t1,t2))
- {
- que.push(t1*+t2);
- Frem[t1][t2]=temp+;
- }
- t1+=;
- if(judge1(t1,t2))
- {
- que.push(t1*+t2);
- Frem[t1][t2]=temp+;
- }
- --t1;
- --t2;
- if(judge1(t1,t2))
- {
- que.push(t1*+t2);
- Frem[t1][t2]=temp+;
- }
- t2+=;
- if(judge1(t1,t2))
- {
- que.push(t1*+t2);
- Frem[t1][t2]=temp+;
- }
- }
- }
- int main()
- {
- ios::sync_with_stdio(false);
- int T;
- int ans;
- char c;
- cin>>T;
- while(T--)
- {
- cou=;
- cin>>N>>M;
- for(int i=;i<=N;++i)
- for(int j=;j<=M;++j)
- {
- rem[i][j]=;
- Frem[i][j]=-;
- cin>>c;
- if(c=='#'||c=='F')
- map1[i][j]=;
- else
- map1[i][j]=;
- if(c=='J')
- Si=i,Sj=j;
- if(c=='F')
- {
- Fi[cou]=i;
- Fj[cou++]=j;
- }
- }
- init();
- ans=slove();
- if(ans==-)
- cout<<"IMPOSSIBLE\n";
- else
- cout<<ans<<endl;
- }
- return ;
- }
(简单) UVA 11624 Fire! ,BFS。的更多相关文章
- UVA - 11624 Fire! bfs 地图与人一步一步先后搜/搜一次打表好了再搜一次
UVA - 11624 题意:joe在一个迷宫里,迷宫的一些部分着火了,火势会向周围四个方向蔓延,joe可以向四个方向移动.火与人的速度都是1格/1秒,问j能否逃出迷宫,若能输出最小时间. 题解:先考 ...
- UVA 11624 Fire! (bfs)
算法指南白书 分别求一次人和火到达各个点的最短时间 #include<cstdio> #include<cstring> #include<queue> #incl ...
- UVA 11624 Fire! bfs 难度:0
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- UVA 11624 Fire! BFS搜索
题意:就是问你能不能在火烧到你之前,走出一个矩形区域,如果有,求出最短的时间 分析:两遍BFS,然后比较边界 #include<cstdio> #include<algorithm& ...
- BFS(两点搜索) UVA 11624 Fire!
题目传送门 /* BFS:首先对火搜索,求出火蔓延到某点的时间,再对J搜索,如果走到的地方火已经烧到了就不入队,直到走出边界. */ /******************************** ...
- UVa 11624 Fire!(着火了!)
UVa 11624 - Fire!(着火了!) Time limit: 1.000 seconds Description - 题目描述 Joe works in a maze. Unfortunat ...
- E - Fire! UVA - 11624(bfs + 记录火到达某个位置所需要的最小时间)
E - Fire! UVA - 11624 题目描述 乔在迷宫中工作.不幸的是,迷宫的一部分着火了,迷宫的主人没有制定火灾的逃跑计划.请帮助乔逃离迷宫.根据乔在迷宫中的位置以及迷宫的哪个方块着火,你必 ...
- UVA 11624 - Fire! 图BFS
看题传送门 昨天晚上UVA上不去今天晚上才上得去,这是在维护么? 然后去看了JAVA,感觉还不错昂~ 晚上上去UVA后经常连接失败作死啊. 第一次做图的题~ 基本是照着抄的T T 不过搞懂了图的BFS ...
- UVa 11624 Fire!(BFS)
Fire! Time Limit: 5000MS Memory Limit: 262144KB 64bit IO Format: %lld & %llu Description Joe ...
随机推荐
- URL的# (转)
http://www.ruanyifeng.com/blog/2011/03/url_hash.html
- 11g init DB software and database
oadmin->administrator2.169set ORACLE_HOME=C:\app\oracle\product\11.2.0\dbhome_1set ORACLE_SID=csm ...
- cocos2d-x 不规则形状按钮的点击判定
cocos2d-x 不规则形状按钮的点击判定 原理: 1.OpeGL ES提供了glReadPixels[^footnote]函数,来获取当前framebuffer上的像素数据 2.cocos2d-x ...
- idea编译报错:未结束的字符串文字;非法的表达式;未结束的字符串字面值
在idea的Settings中,找到File Encodings,将IDE Encoding 改为UTF-8 要多试几次,清除缓存什么的,具体原因不知道,不过经常第一次修改不能成功.
- linux 进程命令
Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...
- HDU 2802 F(N)(简单题,找循环解)
题目链接 F(N) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- php 批量导入数据的一种思维
<?php $str="风湿免疫科 消化内科 内分泌科 神经内科 感染内科 心血管内科放疗中心";$arr=explode(' ',$str);$sql="&quo ...
- javascript语句语义大全(3)
1. for(var i=0;i<10;i++){ } for循环,括号里面是循环条件,翻译过来是,初始设定1=0:没循环一次i会+1,直到i<10 2. var i=0: while(i ...
- 天棋哥哥大战AlphaGo
天棋哥哥大战AlphaGo Time Limit: 1 Sec Memory Limit: 128 MB Submit: 20 Solved: 9 [Submit][Status][Web Boa ...
- UVALive 2056 Lazy Math Instructor(递归处理嵌套括号)
因为这个题目说明了优先级的规定,所以可以从左到右直接运算,在处理嵌套括号的时候,可以使用递归的方法,给定每一个括号的左右边界,伪代码如下: int Cal(){ if(括号) sum += Cal( ...