题目链接 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!的更多相关文章

  1. (广搜)Fire Game -- FZU -- 2150

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82828#problem/I Fire Game Time Limit:1000MS    ...

  2. 并查集(UVA 1106)

    POINT: 把每个元素看成顶点,则一个简单化合物就是一条无向边,若存在环(即k对组合中有k种元素),则危险,不应该装箱,反之,装箱: 用一个并查集维护连通分量集合,每次得到一种化合物(x, y)时检 ...

  3. UVA - 11624 J - Fire! (BFS)

    题目传送门 J - Fire! Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the ...

  4. L-Gap Substrings(uva 10829)

    题意:有一种形如uvu形式的字符串,其中u是非空字符串,且V的长度正好为L,那么称这个字符串为L-Gap字符串 给出一个字符串S,以及一个正整数L,问S中有多少个L-Gap子串. /* 这道题用到一个 ...

  5. Minimum Sum LCM(uva 10791)

    题意(就是因为读错题意而wa了一次):给一个数字n,范围在[1,2^23-1],这个n是一系列数字的最小公倍数,这一系列数字的个数至少为2 例如12,是1和12的最小公倍数,是3和4的最小公倍数,是1 ...

  6. Killer Problem (UVA 11898 )

    Problem You are given an array of N integers and Q queries. Each query is a closed interval [l, r]. ...

  7. POJ 2250 Compromise (UVA 531)

    LCS问题.基金会DP. 我很伤心WA非常多.就在LCS问题,需要记录什么路. 反正自己的纪录path错误,最后,就容易上当. 没有优化,二维阵列,递归打印,cin.eof() 来识别 end of ...

  8. 【UVA - 11624】Fire!

    -->Fire! 直接上中文 Descriptions: 乔在迷宫中工作.不幸的是,迷宫的一部分着火了,迷宫的主人没有制定火灾的逃跑计划.请帮助乔逃离迷宫.根据乔在迷宫中的位置以及迷宫的哪个方块 ...

  9. uva 1639--精度处理方法之取对数(uva 1639)

    1639 - Candy Time limit: 3.000 seconds 1639 CandyLazyChild is a lazy child who likes candy very much ...

随机推荐

  1. SQL SERVER NVARCHAR字段INSERT 中文乱码问题解决

    INSERT INTO IPatient ( UID, PatientNo, PatientName, PatientGender, Birthday, BloodType, Country, Nat ...

  2. GLSL实现Glow效果 [转]

    http://blog.csdn.net/a3070173/archive/2008/11/04/3220940.aspx Glow即辉光效果现在已成为3D图形中一个引人注目的特效.本文主要介绍如何使 ...

  3. 【VBA研究】怎样将单元格数据赋给数组

    作者:iamlaosong 将工作表中的数据赋给数组或者将数组的数据赋给工作表,一般有两种.一种是循环的方法,一个一个的传,这样的方法一般用于须要对每一个数据特别处理的场合,还有一种是一次性用赋值语句 ...

  4. OpenCV之邻域运算之最值滤波

    写了一段小程序,分享给大家! //==================================================================== // 作者 : quarry ...

  5. c语言指针函数与函数指针

    例一:指针函数 指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针 类型标识符    *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个 ...

  6. python 调用zabbix api接口实现主机的增删改查

    python程序调用zabbix系统的api接口实现对zabbix_server端主机的增删改查,使用相关功能时候,需要打开脚本中的相关函数. 函数说明: zabbixtools()  调用zabbi ...

  7. ArcGIS Server 10.2 实战(三)图层标注及图例中文显示乱码的解决

    发布的图层中不可避免的使用到中文来标注,默认设置下,ArcGIS Server不支持中文的,中文标注显示成乱码,主要是编码的问题,需要把手动把编码改为UTF-8. ArcGIS Server 10.2 ...

  8. Windows Azure 微软公有云体验(三) IIS中文编码解决方案

    Windows Azure 微软公有云已经登陆中国有一段时间了,现在是处于试用阶段,Windows Azure的使用将会给管理信息系统的开发.运行.维护带来什么样的新体验呢? Windows Azur ...

  9. SQL Server blocking session

    select * from sys.sysprocesses where blocked>0; 96被95block住了. dbcc INPUTBUFFER(95) dbcc INPUTBUFF ...

  10. Linux vsftp

    本机环境CentOS-6.6-i386-bin-DVD1.iso安装盘.安装时选择minimal模式.本机IP地址配置为192.168.0.211. 1.查询系统是否已安装了vsftpd [root@ ...