Description:  

  You are trapped in a building consisting of open spaces and walls. Some places are on fire and you have to run for the exit. Will you make it?
At each second, the fire will spread to all open spaces directly connected to the North, South, East or West side of it. Fortunately, walls will never catch fire and will keep the fire inside the building, so as soon as you are out of the building you will be safe. To run to any of the four open spaces adjacent to you takes you exactly one second. You cannot run through a wall or into an open space that is on fire or is just catching fire, but you can run out of an open space at the same moment it catches fire.
  Given a map of the building, decide how fast you can exit the building.

Input:

  On the first line one positive number: the number of test cases, at most 100. After that per test case:

  one line with two space-separated integers w and h (1 <= w, h <= 1 000): the width and height of the map of the building, respectively.
  h lines with w characters each: the map of the building, consisting of
  – ‘.’: a room,
  – ‘#’: a wall,
  – ‘@’: your starting location,
  – ‘*’: fire.
  There will be exactly one ‘@’ in the map.

Output:

  Per test case:one line with a single integer which is the minimal number of seconds that you need to exit the building or the string “IMPOSSIBLE” when this is not possible.

思路:用两个队列分别存放人和大火所在位置,然后从队列取出,对每个‘@’和‘*’所在的点进行四个方向的拓展,对于‘@’,遇到‘.’则将‘.’替换成‘@’,并推进队列,表示人走过的安全点;对于‘*’,遇到‘.’和‘@’都替换成‘*’,并推进队列,表示火蔓延到该点。程序停止的条件为人已安全走出建筑物或被大火蔓延消失鸟。略挫,供参考=o=

/*0.28sec    4236 KB    3179 Bytes*/
#include <iostream>
#include <cstring>
#include <queue>
using namespace std; #define MAX 1010
typedef pair<int,int> Location; char room[MAX][MAX];
bool visit[MAX][MAX]; int dirt[][] = { {-,}, {,}, {,}, {,-}};
int x,y,costTime;
queue<Location> fire;
queue<Location> man; bool safeOrNot(int w,int h)
{
bool safe = false;
costTime = ;
while()
{
int man_Size = man.size();
int fire_Size = fire.size();
for(int k = ; k < fire_Size; k++)
{
Location cur = fire.front();
fire.pop();
for(int p = ; p < ; p++)
{
x = cur.first + dirt[p][];
y = cur.second + dirt[p][];
if( x >= && x < h && y >= && y < w && !visit[x][y])
{
if(room[x][y] == '.')
{
room[x][y] = '*';
//cout <<"room["<< x <<"]["<<y<<"] = '.'"<<endl;
fire.push(make_pair(x,y));
visit[x][y] = true;
}
}
else if(visit[x][y] && room[x][y] == '@')
{
room[x][y] = '*';
fire.push(make_pair(x,y));
}
}
}
for(int i = ; i < man_Size; i++)
{
Location tem = man.front();
man.pop();
for(int j = ; j < ; j++)
{
x = tem.first + dirt[j][];
y = tem.second + dirt[j][];
if( x >= && x < h && y >= && y < w && !visit[x][y])
{
if(room[x][y] == '.')
{
room[x][y] = '@';
man.push(make_pair(x,y));
visit[x][y] = true;
}
else
continue;
}
else if(x < || x >= h || y< || y >= w)
{
safe = true;
return safe;
}
}
}
costTime ++;
if(man.empty())
return safe;
}
} int main()
{
int T,w,h;
cin >> T;
while( T-- )
{
cin >> w >> h;
memset(room, , sizeof(room));
memset(visit,false,sizeof(visit));
while(!fire.empty())
{
fire.pop();
}
while(!man.empty())
{
man.pop();
}
for(int i = ; i < h; i++)
{
for(int j = ; j < w; j++)
{
cin >> room[i][j];
if(room[i][j] == '.')
visit[i][j] = false;
else
visit[i][j] = true;
if(room[i][j] == '@')
man.push(make_pair(i,j));
if(room[i][j] == '*')
fire.push(make_pair(i,j));
}
}
if(safeOrNot(w,h) )
cout << costTime << endl;
else
cout << "IMPOSSIBLE" << endl;
}
//system("pause");
return ;
}

Fire逃生的更多相关文章

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

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

  2. CSUOJ 2031 Barareh on Fire

    Description The Barareh village is on fire due to the attack of the virtual enemy. Several places ar ...

  3. CSU - 2031 Barareh on Fire (两层bfs)

    传送门: http://acm.csu.edu.cn/csuoj/problemset/problem?pid=2031 Description The Barareh village is on f ...

  4. UVA11624 Fire! —— BFS

    题目链接:https://vjudge.net/problem/UVA-11624 题解: 坑点:“portions of the maze havecaught on fire”, 表明了起火点不唯 ...

  5. 关于SequeezeNet中的Fire Module

    在论文<SQUEEZENET: ALEXNET-LEVEL ACCURACY WITH 50X FEWER PARAMETERS AND <0.5MB MODEL SIZE>中,作者 ...

  6. FZU 2150 Fire Game

    Fire Game Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit St ...

  7. HDU 4857 逃生 (反向拓扑排序 & 容器实现)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 逃生 Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  8. Fire

    Fire 分析: 首先,明确题意:b1,b2,--,bn 交换为b2,--,bn,b1,但这并不是意味着只能从b1开始交换,(这点从样例中可以看出),并且也不意味着交换的必须是连续的一串,可以是几个单 ...

  9. Android 轻量级输入校验库:Fire Eye

    Fire Eye是一款轻量级简单易用的Android校验库. FireEye 2.0 在 1.0 的基础上,全部重写了代码,并优化了架构,性能上和逻辑上都大大提升.只需要几行代码,即可验证用户输入,并 ...

随机推荐

  1. qml操作播放器

    现在增加了一个filter属性,所以可以很好和opencv结合.转一篇文章(http://blog.qt.io/blog/2015/03/20/introducing-video-filters-in ...

  2. 小记:获取系统时间的long值,格式化成可读时间。

    /** * 返回的字符串形式是形如:2013年10月20日 20:58 * */ public static String formatTimeInMillis(long timeInMillis) ...

  3. HDU 1542 线段树+扫描线+离散化

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  4. Windows7下U盘安装Ubuntu14.04双系统

    1.准备工作 (1)下载Ubuntu14.04系统镜像文件,Ultraiso,EasyBcd,分区助手 Ubuntu14.04地址:http://www.ubuntu.com/download/des ...

  5. CRF++使用小结

    1. 简述 最近要应用CRF模型,进行序列识别.选用了CRF++工具包,具体来说是在VS2008的C#环境下,使用CRF++的windows版本.本文总结一下了解到的和CRF++工具包相关的信息. 参 ...

  6. C++-不要在构造和析构函数中调用虚函数

    在实习的单位搞CxImage库时不知为什么在Debug时没有问题,但是Release版里竟然跳出个Pure virtual function call error! 啥东西呀,竟然遇上了,就探个究竟吧 ...

  7. ssl和https协议详解

    转自:https://cuiyongxiu.com/201102/24157.html ssl协议的起源和历史我就不再多说了,就是那个Netscape 网景公司开发的,它的作用主要是提供了一种安全传输 ...

  8. UITextView添加一个placeholder功能

    控件UITextField有个placeholder属性,UITextField和UITextView使用方法基本类似,有两个小区别:1.UITextField单行输入,而UITextView可以多行 ...

  9. Linux登陆和欢迎信息修改

    edit file: /etc/issue,/etc/motd 这样还改不了,生成的脚本在目录/etc/update-motd.d/中: 假如要打开一个文本文件,可以修改10-help-text: ( ...

  10. Html获取经纬度

    if (navigator.geolocation) { navigator.geolocation.getCurrentPosition( function success(pos) {alert( ...