题目来源 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; typedef struct { int x,y,z; int lev; }Loc; Loc start; 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 ; while (!q.empty()){ Loc now,next; now = q.front(); q.pop(); for (int i = 0 ; i < 6 ; i++){ 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 ; 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 ; }
v1.5.2