地牢大师
CYY

题目来源

https://www.acwing.com/problem/content/1098/


题目

你现在被困在一个三维地牢中,需要找到最快脱离的出路!

地牢由若干个单位立方体组成,其中部分不含岩石障碍可以直接通过,部分包含岩石障碍无法通过。

向北,向南,向东,向西,向上或向下移动一个单元距离均需要一分钟。

你不能沿对角线移动,迷宫边界都是坚硬的岩石,你不能走出边界范围。

请问,你有可能逃脱吗?

如果可以,需要多长时间?

输入格式

输入包含多组测试数据。

每组数据第一行包含三个整数 L,R,C 分别表示地牢层数,以及每一层地牢的行数和列数。

接下来是 L 个 R 行 C 列的字符矩阵,用来表示每一层地牢的具体状况。

每个字符用来描述一个地牢单元的具体状况。

其中, 充满岩石障碍的单元格用”#”表示,不含障碍的空单元格用”.”表示,你的起始位置用”S”表示,终点用”E”表示。

每一个字符矩阵后面都会包含一个空行。

当输入一行为”0 0 0”时,表示输入终止。

输出格式

每组数据输出一个结果,每个结果占一行。

如果能够逃脱地牢,则输出”Escaped in x minute(s).”,其中X为逃脱所需最短时间。

如果不能逃脱地牢,则输出”Trapped!”。

数据范围

1≤L,R,C≤100

输入样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
3 4 5
S....
.###.
.##..
###.#

#####
#####
##.##
##...

#####
#####
#.###
####E

1 3 3
S##
#E#
###

0 0 0

输出样例:

1
2
Escaped in 11 minute(s).
Trapped!

AC代码

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int MAX = 103;
int moving[6][3] = {{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}};//偏移量
char map[MAX][MAX][MAX];
int a,b,c; //地图最大值,a最大层数,b最大行数,c最大列数

typedef struct{
int x,y,z; //x,y,z坐标
int lev; //到达该点所用时间
}Loc; //定义位置结构体

Loc start; //存储开始位置'S'所在坐标

//判断位置是否越界
bool isTrue(Loc loc){
return loc.x>=0&&loc.x<a&&loc.y>=0&&loc.y<b&&loc.z>=0&&loc.z<c;
}
//宽搜函数
void bfs(){
queue<Loc> q; //宽搜其实就是层次遍历,所以用到队列
q.push(start); //将开始位置入队
map[start.x][start.y][start.z] = '#'; //初始化开始位置为已经访问
start.lev = 0; //初始化到达起点位置所需时间为0
while(!q.empty()){
Loc now,next; //定义当前所在位置和下一位置
now = q.front(); //将对首元素取出,作为当前所在位置
q.pop(); //到达该位置后将该位置出队
for(int i = 0; i < 6; i++){
//遍历上下左右前后6个方向
next.x = now.x + moving[i][0]; //下一位置坐标=当前位置坐标+偏移量
next.y = now.y + moving[i][1];
next.z = now.z + moving[i][2];
next.lev = now.lev + 1; //到达下一位置时间=当前时间+1
//如果下一位置合理(没有地图越界)
if(isTrue(next)){
//如果下一位置不可通过,或者已经到达过了就不在访问
if(map[next.x][next.y][next.z] == '#') continue;
//如果下一位置可以访问
if(map[next.x][next.y][next.z] == '.'){
q.push(next); //将下一位置入队,等待下次出队访问
map[next.x][next.y][next.z] = '#'; //设置下一位置已经访问
}
//如果下一位置为出口
if(map[next.x][next.y][next.z] == 'E'){
//直接打印时所需要花费的时间
cout<<"Escaped in "<<next.lev<<" minute(s)."<<endl;
return; //结束遍历
}
}
}
}
cout<<"Trapped!"<<endl;
}
int main(){
while(cin>>a>>b>>c,a||b||c){
memset(map,'#',sizeof(map));
for(int i = 0; i < a; i++){
for(int j = 0; j < b; j++){
for(int k = 0; k < c; k++){
cin>>map[i][j][k];
if(map[i][j][k] == 'S') {
start.x = i;
start.y = j;
start.z = k;
}
}
getchar();
}
getchar();
}

bfs();
}
return 0;
}
 Comments
Comment plugin failed to load
Powered By Valine
v1.5.2