Fire逃生
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逃生的更多相关文章
- UVa 11624 Fire!(着火了!)
UVa 11624 - Fire!(着火了!) Time limit: 1.000 seconds Description - 题目描述 Joe works in a maze. Unfortunat ...
- CSUOJ 2031 Barareh on Fire
Description The Barareh village is on fire due to the attack of the virtual enemy. Several places ar ...
- CSU - 2031 Barareh on Fire (两层bfs)
传送门: http://acm.csu.edu.cn/csuoj/problemset/problem?pid=2031 Description The Barareh village is on f ...
- UVA11624 Fire! —— BFS
题目链接:https://vjudge.net/problem/UVA-11624 题解: 坑点:“portions of the maze havecaught on fire”, 表明了起火点不唯 ...
- 关于SequeezeNet中的Fire Module
在论文<SQUEEZENET: ALEXNET-LEVEL ACCURACY WITH 50X FEWER PARAMETERS AND <0.5MB MODEL SIZE>中,作者 ...
- FZU 2150 Fire Game
Fire Game Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit St ...
- HDU 4857 逃生 (反向拓扑排序 & 容器实现)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 逃生 Time Limit: 2000/1000 MS (Java/Others) Mem ...
- Fire
Fire 分析: 首先,明确题意:b1,b2,--,bn 交换为b2,--,bn,b1,但这并不是意味着只能从b1开始交换,(这点从样例中可以看出),并且也不意味着交换的必须是连续的一串,可以是几个单 ...
- Android 轻量级输入校验库:Fire Eye
Fire Eye是一款轻量级简单易用的Android校验库. FireEye 2.0 在 1.0 的基础上,全部重写了代码,并优化了架构,性能上和逻辑上都大大提升.只需要几行代码,即可验证用户输入,并 ...
随机推荐
- plsql快速选中一行的快捷键
实际工作中,经常用到pl/sql,在sql window中,经常性的用到选中一行然后按F8执行这条sql语句.用鼠标选中一行不是特别方便.用快捷键就快多了. 1.使用home键(不是windows键奥 ...
- [Js]跟随鼠标移动的div
例子:鼠标移动到一块东西上,出现提示文本框,并且提示文本框跟着鼠标的位置动 document.onmouseover=function(ev){ var oEvent=ev||event; var b ...
- mapreduce job提交流程源码级分析(三)
mapreduce job提交流程源码级分析(二)(原创)这篇文章说到了jobSubmitClient.submitJob(jobId, submitJobDir.toString(), jobCop ...
- BindingNavigator操作DatagridView的数据
参考 http://wenku.baidu.com/link?url=NWfEfArPZvDO_aI-xEKBHVGoZY9wQO_Oty_GCsGLiPspheCzFYLf_dytuWAqN2_0A ...
- POJ 2559 Program C
Submit Status Practice POJ 2559 Description A histogram is a polygon composed of a sequence of recta ...
- Python应用与实践
http://www.cnblogs.com/skynet/archive/2013/05/06/3063245.html
- 百度地图开发 android App 数字签名(SHA1)获取办法
简述: a.输入keytool -list -v -keystore debug.keystore,会得到三种指纹证书,选取SHA1类型的证书(密钥口令是android),这个获取到的SHA1的值和e ...
- Browser GetImage
using Microsoft.Win32; using System; using System.ComponentModel; using System.Drawing; using System ...
- Linux 上的常用文件传输方式介绍与比较
ftp ftp 命令使用文件传输协议(File Transfer Protocol, FTP)在本地主机和远程主机之间或者在两个远程主机之间进行文件传输. FTP 协议允许数据在不同文件系统的主机之间 ...
- IOS 导航栏属性设置
IOS 7 以上系统导航栏: [[UINavigationBar appearance] setTintColor:[UIColor whiteColor]]; // 返回按钮颜色 [UINaviga ...