Sicily 1754. 逃离洞穴
来源:互联网 发布:淘宝包包店铺名字大全 编辑:程序博客网 时间:2024/04/29 07:48
1754. 逃离洞穴
Constraints
Time Limit: 1 secs, Memory Limit: 32 MB
Description
04级ZEH和YYR到一个洞穴探险,其中YYR进入洞穴探险,而ZEH在洞外附近利用自发研制的X-1探测器监测洞穴的喷气口是否开始喷射毒气。洞穴里面有若干个毒气喷射口,已知毒气的扩散速度是每单位时间向上下左右扩散一格,而YYR的逃逸速度也是每单位时间向上下左右移动一格。所有的毒气喷射口都是同时喷发的,当监测到喷射时,ZEH就马上通知YYR逃离,YYR必须在不遇到毒气的情况下尽快逃离洞穴。亲爱的师弟师妹,你们可以帮他们计算一下YYR最快逃离洞穴的时间吗?
Input
洞穴地图用矩阵表示,符号. 表示通路,符号X表示障碍物,符号E表示洞口,符号D表示毒气喷射口所在地,符号P表示YYR当前的位置。输入首先是两个整数m, n(2<=m,n<=1000)表示矩阵的大小。接下来是m行n列的矩阵图。矩阵描述之外的地方都是障碍物且只有一个逃离的洞口,但可能有多个毒气喷射口,且扩散到洞口的毒气立即消散。输入有多组数据,当m,n是0 0时表示输入结束。
Output
如果YYR能够顺利逃离洞穴,则输出最快逃离洞口的时间,否则输出“YYR is extremely dangerous!”
Sample Input
5 10XXXXX..XXXXXXE...XXXXX.......XX......P.XXD.....XXX5 10XXXXX..XXXXXXE...XXXXX.......XX......P.XX.D....XXX0 0
Sample Output
6YYR is extremely dangerous!
// Problem#: 1754// Submission#: 3326115// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/// All Copyright reserved by Informatic Lab of Sun Yat-sen University#include <algorithm>#include <iostream>#include <string>#include <stdio.h>#include <queue>#include <string.h>#include <vector>#include <iomanip>#include <map>#include <stack>#include <functional>#include <list>#include <cmath>using namespace std;const int MAX_W = 1005;bool visGas[MAX_W][MAX_W];bool visP[MAX_W][MAX_W];char G[MAX_W][MAX_W];int H, W;int Ei, Ej;queue<pair<int, int> > gas;queue<pair<int, int> > q;int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};int step;bool isValidGas(int i, int j) { return 0 <= i && i < H && 0 <= j && j < W && !visGas[i][j] && (G[i][j] == '.' || G[i][j] == 'P');}bool isValidP(int i, int j) { return 0 <= i && i < H && 0 <= j && j < W && !visP[i][j] && G[i][j] == '.';}void GAS() { int s = gas.size(); while (s--) { pair<int, int> p = gas.front(); gas.pop(); for (int i = 0; i < 4; i++) { int nextI = p.first + dir[i][0]; int nextJ = p.second + dir[i][1]; if (isValidGas(nextI, nextJ)) { G[nextI][nextJ] = 'D'; visGas[nextI][nextJ] = true; gas.push(make_pair(nextI, nextJ)); } } }}bool BFS() { step = 0; while (!q.empty()) { int s = q.size(); GAS(); step++; while (s--) { pair<int, int> p = q.front(); q.pop(); //if (G[p.first][p.second] == 'D') continue; for (int i = 0; i < 4; i++) { int nextI = p.first + dir[i][0]; int nextJ = p.second + dir[i][1]; if (nextI == Ei && nextJ == Ej) return true; if (isValidP(nextI, nextJ)) { visP[nextI][nextJ] = true; q.push(make_pair(nextI, nextJ)); } } } } return false;}int main() { //std::ios::sync_with_stdio(false); while (1) { cin >> H >> W; if (H == 0 && W == 0) break; for (int i = 0; i < H; i++) { cin >> G[i]; for (int j = 0; j < W; j++) { if (G[i][j] == '.') visP[i][j] = visGas[i][j] = false; if (G[i][j] == 'D') { gas.push(make_pair(i, j)); visGas[i][j] = true; } if (G[i][j] == 'P') { q.push(make_pair(i, j)); visP[i][j] = true; } if (G[i][j] == 'E') { Ei = i; Ej = j; } } } if (BFS()) cout << step << endl; else cout << "YYR is extremely dangerous!" << endl; while (!gas.empty()) gas.pop(); while (!q.empty()) q.pop(); } //getchar(); //getchar(); return 0;}
0 0
- Sicily 1754. 逃离洞穴
- Sicily 1754 逃离洞穴
- soj 1754. 逃离洞穴
- 1754. 逃离洞穴
- 逃离洞穴(escape)
- jzoj 1360. 【2011.12.31普及模拟】逃离洞穴
- Sicily 1484. 守望者的逃离
- [sicily]1484. 守望者的逃离
- 逃离
- 逃离
- 逃离
- 死亡洞穴
- 死亡洞穴
- 洞穴逃生
- 洞穴逃生
- 洞穴逃生
- 洞穴逃生
- 洞穴 Cave
- ubuntu环境下静态ip地址设置--重启后仍然有效
- Burpsuite
- linux命令详解——crontab
- iOS越狱开发 SandBox中获取root权限
- 用户角色分组使用license
- Sicily 1754. 逃离洞穴
- 数据结构复习—C++实现静态顺序表
- 实例详解Linux下MySQL数据库性能调优方法
- 内部排序算法
- Rotate List
- 强大的分组SectionListView, 支持自定义组头布局和分组的内容布局, 组头有挤压效果
- 3、求100-1000之间的水仙花数。(水仙花数,是指一个三位数,它的各位数字的立方和等于自身数,例:153=13+53+33)
- 关于matlab的编译问题--出现找不到指定模块C:MATLAB7\bin\win32\atlas_Athlon.dll
- Linux的网络编程面试题汇总