Time Limit: 5000MS   Memory Limit: 262144KB   64bit IO Format: %lld & %llu

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.

Input

The first line of input contains the two integers  R and  C, separated by spaces, with 1 <=  RC <= 1000. The following  R lines of input 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 the input.

Output

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

Case #1:
4 4
####
#JF#
#..#
#..# Case #2:
3 3
###
#J.
#.F

Sample Output

3
IMPOSSIBLE

Source

waterloo 13 June, 2009

题目本身不难,但是很容易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)的更多相关文章

  1. uva 11624 Fire!(搜索)

    开始刷题啦= = 痛并快乐着,学到新东西的感觉其实比看那些无脑的小说.电视剧有意思多了 bfs裸体,关键是先把所有的着火点放入队列,分开一个一个做bfs会超时的 发现vis[][]是多余的,完全可以用 ...

  2. UVa 11624 Fire!(着火了!)

    UVa 11624 - Fire!(着火了!) Time limit: 1.000 seconds Description - 题目描述 Joe works in a maze. Unfortunat ...

  3. UVA 11624 - Fire! 图BFS

    看题传送门 昨天晚上UVA上不去今天晚上才上得去,这是在维护么? 然后去看了JAVA,感觉还不错昂~ 晚上上去UVA后经常连接失败作死啊. 第一次做图的题~ 基本是照着抄的T T 不过搞懂了图的BFS ...

  4. UVA 11624 Fire!(两次BFS+记录最小着火时间)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

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

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

  6. UVA 11624 Fire!(广度优先搜索)

    题目大意:在一个N*M的迷宫内,J代表某人(只有一个),F代表火(可能不只一个),#代表墙,火每分钟会向四周除了墙以外的地方扩散一层,问人能否在没被火烧到 之前逃出迷宫,若能逃出输出最短时间.很明显的 ...

  7. (简单) UVA 11624 Fire! ,BFS。

    Description Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the ow ...

  8. UVA - 11624 Fire! 【BFS】

    题意 有一个人 有一些火 人 在每一秒 可以向 上下左右的空地走 火每秒 也会向 上下左右的空地 蔓延 求 人能不能跑出来 如果能 求最小时间 思路 有一个 坑点 火是 可能有 多处 的 样例中 只有 ...

  9. UVA - 11624 Fire! 双向BFS追击问题

    Fire! Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of ...

随机推荐

  1. Linux设置IP

    进入 vi /etc/sysconfig/network-scripts/ifcfg-eth0  root # ifconfig eth0 192.168.22.232 root # route ad ...

  2. iptables 开启80端口

    [root@v01-svn-test-server online]# iptables -F#清空规则 [root@v01-svn-test-server online]# iptables -L# ...

  3. Zabbix discoverer processes more than 75% busy

    [root@86 ~]# grep -n "StartDiscoverers" /usr/local/zabbix/etc/zabbix_server.conf 176:### O ...

  4. ytu 1304:串的简单处理(水题)

    串的简单处理 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 39  Solved: 11[Submit][Status][Web Board] Desc ...

  5. hdu 1754 单点更新

    题意:很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感.不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师 ...

  6. poj 1811 大数分解

    模板 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h> ...

  7. 建模算法(一)——线性规划

    一.解决问题 主要是安排现有资源(一定),取得最好的效益的问题解决,而且约束条件都是线性的. 二.数学模型 1.一般数学模型 2.MATLAB数学模型 其中c,x都是列向量,A,Aeq是一个合适的矩阵 ...

  8. Servlet应用的运行流程

    其中,红色部分为我们开发人员要做的,其他部分是框架做的. 学习就要搞懂整个运行的流程!否则,不利于个人技术的积累!

  9. 神奇的HTML5离线存储(应用程序缓存)

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接前端小尚,谢谢! 前言 使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本. HTML5引入 ...

  10. 在Windows下利用MinGW编译FFmpeg

    目录 [隐藏]  1 环境与软件 2 第一步:安装MinGW 3 第二步:配置编译环境 4 第三步:配置SDL 5 第四步:编译 5.1 编译faac 5.2 编译fdk-aac 5.3 编译x264 ...