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. UVA 10325 The Lottery( 容斥原理)

    The Sports Association of Bangladesh is in great problem with their latest lottery `Jodi laiga Jai'. ...

  2. input框颜色修该

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. Flesch Reading Ease (poj 3371)

    题意: 给出一篇规范的文章,求其 句子数.单词数 和 音节数把这3个值代入题目给出的公式,输出其结果,保留2位小数. 标记单词分隔符: 逗号(,) 和 空格( ) 句子分隔符:句号(.) 问号(?) ...

  4. 爱改名的小融 2(codevs 3149)

    3149 爱改名的小融 2  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description Wikioi上有个人 ...

  5. zabbix 修改管理员用户密码

    mysql> use zabbix mysql> desc users; +----------------+---------------------+------+-----+---- ...

  6. js 抽奖转盘实现

    今天用js实现转盘抽奖功能,从后台返回的值可以固定转盘选择停止的任意位置 实现代码如下: js: <script> , i = ;//auto:时间对象 count:计数器 ,i : 计数 ...

  7. 最新版Duilib在VS2012下编译错误的解决方法

            svn了好几次最新版本的项目源代码, 在VS2012下编译老是出错, 改了后没记录, 结果又忘记, 所以在此记录下.        这个问题很普遍, 非常多的人遇到.       至于 ...

  8. MQ的通讯模式

    1) 点对点通讯:点对点方式是最为传统和常见的通讯方式,它支持一对一.一对多.多对多.多对一等多种配置方式,支持树状.网状等多种拓扑结构. 2) 多点广播:MQ适用于不同类型的应用.其中重要的,也是正 ...

  9. html5 (个人笔记)

    妙味 html5  1.0 <!DOCTYPE html> <html> <head lang="en"> <meta charset=& ...

  10. 利用PowerDesigner比较2个数据库结构

    主要实现思路 建立新旧数据库ODBC 导入原始数据模型 选择并比较对象 .PowerDesigner中可以对2个数据模型进行比较,所以想到用这个功能来实现对比数据库的目的.到底怎样利用PowerDes ...