B - Dungeon Master POJ - 2251
1 //纯bfs 2 #include <iostream> 3 #include <algorithm> 4 #include <cstring> 5 #include <cstdio> 6 #include <queue> 7 8 using namespace std; 9 const int maxn = 33; 10 char g[maxn][maxn][maxn]; 11 bool vis[maxn][maxn][maxn]; 12 int f[6][3] = { { 1, 0, 0 }, { -1, 0, 0 }, { 0, 1, 0 }, { 0, -1, 0 }, { 0, 0, 1 }, { 0, 0, -1 } }; 13 int L, R, C; 14 struct node{ 15 int x, y, z; 16 int flag; 17 }last, now; 18 19 void bfs(int x1, int y1, int z1){ 20 vis[z1][x1][y1] = true; 21 queue<node>q; 22 while (!q.empty()){ 23 q.pop(); 24 } 25 last.x = x1; last.y = y1; last.z = z1; 26 last.flag = 0; 27 q.push(last); 28 while (!q.empty()){ 29 last = q.front(); 30 q.pop(); 31 if (g[last.z][last.x][last.y] == 'E'){ 32 cout << "Escaped in " << last.flag << " minute(s)." << endl; 33 return; 34 } 35 for (int i = 0; i < 6; i++){ 36 now.z = last.z + f[i][0]; 37 now.x = last.x + f[i][1]; 38 now.y = last.y + f[i][2]; 39 now.flag = last.flag + 1; 40 if (now.z < 0 || now.z >= L || now.x < 0 || now.y < 0 || now.x >= R || now.y >= C) 41 continue; 42 if (!vis[now.z][now.x][now.y] && g[now.z][now.x][now.y] != '#'){ 43 vis[now.z][now.x][now.y] = true; 44 q.push(now); 45 } 46 } 47 } 48 cout << "Trapped!" << endl; 49 } 50 51 int main(){ 52 ios::sync_with_stdio(false); 53 while (cin>>L>>R>>C){ 54 if (!L && !R && !C) 55 break; 56 int x, y, z; 57 memset(vis, false, sizeof(vis)); 58 for (int i = 0; i < L; i++){ 59 for (int j = 0; j < R; j++){ 60 for (int k = 0; k < C; k++){ 61 char s; 62 cin >> s; 63 g[i][j][k] = s; 64 if (s == 'S'){ 65 z = i; x = j; y = k; 66 } 67 } 68 } 69 } 70 bfs(x, y, z); 71 72 } 73 return 0; 74 }