/* 题目大意:输入一个三维迷宫,S为起点,E为终点,求S到E的最小步数 * 解题思路:就是比二维迷宫多了一维,解法还是一样的,直接BFS水过。需要注意的是三维坐标是的数组是Z,X,Y */#include <cstdio>#include <cstring>#include <queue>#include <algorithm>using namespace std;#define MAX 31#define DIR 6struct Point{ int x, y, z, time;};int dir[][3] = { {1, 0, 0}, {0, 1, 0}, {0, 0, 1}, {-1, 0, 0}, {0, -1, 0}, {0, 0, -1}};int target_x, target_y, target_z;bool visited[MAX][MAX][MAX];char a[MAX][MAX][MAX];int X, Y, Z;int BFS(int x, int y, int z){ queue<Point> Q; visited[z][x][y] = true; Point p; p.x = x; p.y = y; p.z = z; p.time = 0; Q.push(p); while( !Q.empty() ) { p = Q.front(); Q.pop(); if( p.x == target_x && p.y == target_y && p.z == target_z ) return p.time; for(int i = 0; i < DIR; i ++){ if( p.x+dir[i][0] < 0 || p.x+dir[i][0] >= X || p.y+dir[i][1] < 0 || p.y+dir[i][1] >= Y || p.z+dir[i][2] < 0 || p.z+dir[i][2] >= Z) continue ; if( !visited[p.z+dir[i][2]][p.x+dir[i][0]][p.y+dir[i][1]] && a[p.z+dir[i][2]][p.x+dir[i][0]][p.y+dir[i][1]] != '#' ) { visited[p.z+dir[i][2]][p.x+dir[i][0]][p.y+dir[i][1]] = true; Point tmp_p; tmp_p.x = p.x+dir[i][0]; tmp_p.y = p.y+dir[i][1]; tmp_p.z = p.z+dir[i][2]; tmp_p.time = p.time + 1; Q.push(tmp_p); } } } return 0;}int main(int argc, char const *argv[]){#ifndef ONLINE_JUDGE freopen("test.in", "r", stdin);#endif int x, y, z; while( ~scanf("%d %d %d", &Z, &X, &Y), X || Y || Z ) { memset(visited, false, sizeof(visited)); for(int i = 0; i < Z; i ++){ for(int j = 0; j < X; j ++){ getchar(); for(int k = 0; k < Y; k ++){ scanf("%c", &a[i][j][k]); if( 'S' == a[i][j][k] ){ z = i, x = j, y = k; } if( 'E' == a[i][j][k] ){ target_z = i, target_x = j, target_y = k; } } } getchar(); } int ans = BFS(x, y, z); if( ans ) printf("Escaped in %d minute(s).\n", ans); else printf("Trapped!\n"); } return 0;}