(UVA 11624)Fire!
题目链接 http://vjudge.net/contest/121377#problem/J
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.
Input
The first line of input contains a single integer, the number of test
cases to follow. The first line of each test case contains the two
integers R and C, separated by spaces, with ≤ R, C ≤ . The
following R lines of the test case each contain one row of the maze. Each of these lines contains exactly
C characters, 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 each test case.
Output
For each test case, output a single line containing ‘IMPOSSIBLE’ if Joe cannot exit the maze before the
fire reaches him, or an integer giving the earliest time Joe can safely exit the maze, in minutes.
Sample Input ####
#JF#
#..#
#..#
###
#J.
#.F
Sample Output IMPOSSIBLE
题意:有个人在一个R*C的迷宫里,迷宫的某些点有火源,以每秒一格的速度向四周扩散,墙过不去,给出人的坐标,走到边缘就算逃出,问这个人是否能成功逃出,如逃出输出需要几秒?如不能输出-1;
方法:先让所有的火向四周扩散,再看这个人是否能逃出去
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<math.h>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
#define ll long long
#define met(a,b) memset(a,b,sizeof(a))
#define N 1009
int w[N][N],ww[N][N];
int a[][]={{,},{-,},{,},{,-}};
char str[N][N];
int n,m;
struct node
{
int x,y,s;
};
queue<node> Q;
node e,f,q,p;
void qq()///求火能蔓延的到所能蔓延的点得时间
{
memset(ww,INF,sizeof(ww));
while(Q.size())
{
p=Q.front();Q.pop();
ww[p.x][p.y]=p.s;
for(int i=;i<;i++)
{
q.x=p.x+a[i][];
q.y=p.y+a[i][];
q.s=p.s+;
if(q.x>=&&q.x<n&&q.y>=&&q.y<m&&str[q.x][q.y]!='#'&&!w[q.x][q.y])
{
w[q.x][q.y]=;
Q.push(q);
}
}
}
}
int dfs()///人从起点开始走所有点遍历,看是否是到出口
{
qq();
memset(w,,sizeof(w));
queue<node> o;
o.push(f);
while(o.size())
{
p=o.front();o.pop();
if(p.x==||p.x==n-||p.y==||p.y==m-)
return p.s+;
for(int i=;i<;i++)
{
q.x=p.x+a[i][];
q.y=p.y+a[i][];
q.s=p.s+;
if(q.x>=&&q.x<n&&q.y>=&&q.y<m&&!w[q.x][q.y]
&&str[q.x][q.y]=='.'&&q.s<ww[q.x][q.y])
{
w[q.x][q.y]=;
o.push(q);
}
}
}
return -;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
met(w,);
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
scanf("%s",str[i]);
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
if(str[i][j]=='F')///不止一个火源,找到一个存一个
{
e.x=i;e.y=j;e.s=;
w[i][j]=;Q.push(e);
}
if(str[i][j]=='J')
{
f.x=i;f.y=j;
f.s=;
}
}
}
int ans;
ans=dfs();
if(ans==-) printf("IMPOSSIBLE\n");
else
printf("%d\n",ans);
}
return ;
}
(UVA 11624)Fire!的更多相关文章
- (广搜)Fire Game -- FZU -- 2150
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82828#problem/I Fire Game Time Limit:1000MS ...
- 并查集(UVA 1106)
POINT: 把每个元素看成顶点,则一个简单化合物就是一条无向边,若存在环(即k对组合中有k种元素),则危险,不应该装箱,反之,装箱: 用一个并查集维护连通分量集合,每次得到一种化合物(x, y)时检 ...
- UVA - 11624 J - Fire! (BFS)
题目传送门 J - Fire! Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the ...
- L-Gap Substrings(uva 10829)
题意:有一种形如uvu形式的字符串,其中u是非空字符串,且V的长度正好为L,那么称这个字符串为L-Gap字符串 给出一个字符串S,以及一个正整数L,问S中有多少个L-Gap子串. /* 这道题用到一个 ...
- Minimum Sum LCM(uva 10791)
题意(就是因为读错题意而wa了一次):给一个数字n,范围在[1,2^23-1],这个n是一系列数字的最小公倍数,这一系列数字的个数至少为2 例如12,是1和12的最小公倍数,是3和4的最小公倍数,是1 ...
- Killer Problem (UVA 11898 )
Problem You are given an array of N integers and Q queries. Each query is a closed interval [l, r]. ...
- POJ 2250 Compromise (UVA 531)
LCS问题.基金会DP. 我很伤心WA非常多.就在LCS问题,需要记录什么路. 反正自己的纪录path错误,最后,就容易上当. 没有优化,二维阵列,递归打印,cin.eof() 来识别 end of ...
- 【UVA - 11624】Fire!
-->Fire! 直接上中文 Descriptions: 乔在迷宫中工作.不幸的是,迷宫的一部分着火了,迷宫的主人没有制定火灾的逃跑计划.请帮助乔逃离迷宫.根据乔在迷宫中的位置以及迷宫的哪个方块 ...
- uva 1639--精度处理方法之取对数(uva 1639)
1639 - Candy Time limit: 3.000 seconds 1639 CandyLazyChild is a lazy child who likes candy very much ...
随机推荐
- Java中Scanner的使用方法
Scanner是SDK1.5新增的一个类,但是使用该类创建一个对象.Scanner reader=new Scanner(System.in); 然后reader对象调用下列方法(函数),读取用户 ...
- Android 4.1源码编译找不到资源文件解决办法
我们在Android framework中修改资源文件时,在Android 4.0之前,都是直接在sourcecode/frameworks/base/core/res/res下面添加对应的资源文件, ...
- iOS开发——网络编程Swift篇&(七)NSURLSession详解
NSURLSession详解 // MARK: - /* 使用NSURLSessionDataTask加载数据 */ func sessionLoadData() { //创建NSURL对象 var ...
- fl,flash,mx包的区别
在ActionScript项目中还真是不能使用mx包中的UI组件. Adobe官方论坛上有一个帖子讲述了这个问题,大致意思是说:你要使用mx包中像Button这样的UI组件都是从U ...
- maven插件开发(二)
因为很多jar都是在开发环境中,没有到仓库中,因此偷个懒,用命令直接自动安装到仓库去.在开发的过程中遇到一个比较诡异的问题,插件用命令调mvn 安装jar到仓库总是抛如下异常: maven Canno ...
- 琐碎-到底要不要SSH免密码设置
搭建了很多次hadoop2.2.0了,尝试过很多不同的启动方法.配置参数.位置,其中涉及到到底要不要配置SSH免密码登录的问题 先是搞清楚为什么需要SSH免密码登录 SSH免密码登录操作步骤: ... ...
- iOS 开发常用宏
来源:iOS_小松哥 链接:http://www.jianshu.com/p/be00c3f3cafd 大家都是知道使用宏不仅方便,而且可以提高开发效率.下面总结了iOS开发过程中的一些常用宏,会持续 ...
- css笔记10:多个id选择器/类选择器包含相同部分问题的探讨
有些时候,我们可以将多个class选择器或者id选择器,html选择器的共同部分提取出来,写在一起,这样的好处是是可以简化css文件 1.首先我们先看一段代码.css,如下: @charset &qu ...
- 开发技巧01——改变Toast显示位置
1.获得Toast对象——Toast toast = Toast.makeText(this, "Top Left!", Toast.LENGTH_SHORT); 2.Toast对 ...
- Angular学习资源汇集
网站 官网:www.angularjs.org 中文官网(社区):www.angularjs.cn 博客 流浪猫的窝 粉丝日记:AngularJS体验式编程系列文章 一介布衣 文档 GitCafe A ...