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. 谷歌官方SwipeRefreshLayout下拉刷新的用法。

    <Android SwipeRefreshLayout:谷歌官方SDK包中的下拉刷新> 下拉刷新在如今移动开发中应用如此广泛和普遍,以至于谷歌干脆在SDK中给予支持.在android-su ...

  2. zoj2132-The Most Frequent Number

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2132 The Most Frequent Number Time Limi ...

  3. Json数据,日期的转换

    using (SQLiteConnection con = new SQLiteConnection(Constants.DATA_SOURCE)) { con.Open(); using (SQLi ...

  4. mac 下隐藏和显示文件

    显示:defaults write com.apple.finder AppleShowAllFiles -bool true隐藏:defaults write com.apple.finder Ap ...

  5. python交互模式下cp65001异常

    unknown encoding: cp65001异常 python安装后进入命令行交互模式,输入任何代码都报unknown encoding: cp65001异常 需要将编码(UTF-8)修改为 简 ...

  6. wp8.1 Study1: 页面导航&页面间值传递

    摘要:wp8.1与wp8中很多API是不一样了,wp8.1把以前wp7.x时的api去掉了,更多与win8.1的API相似.比如以下的页面导航和页面之间的值传递 1.页面导航 利用Frame.Navi ...

  7. HTTP状态代码

    1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码. 100 (继续) 请求者应当继续提出请求. 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分. 101 (切换协议) 请求 ...

  8. C++中的容器类详解

    一.STL容器类 STL(Standard Template Library)的六大组件:容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adap ...

  9. 图像显示与加载——opencv(转)

    cvLoadImage() 函数:IplImage* cvLoadImage("图像名称",参数): 函数作用:加载图片: 函数返回值:为IplImage结构体: 参数说明:参数值 ...

  10. 端口占用问题——netstat命令

    1.查看所有的端口占用情况 C:\>netstat -ano 协议 本地地址            外部地址   状态           PID(进程号) TCP 127.0.0.1:1434 ...