Is an escape possible? If yes, how long will it take?
Input
The input consists of a number of dungeons. Each dungeon description starts with a line containing three integers L, R and C (all limited to 30 in size).
L is the number of levels making up the dungeon.
R and C are the number of rows and columns making up the plan of each level.
Then there will follow L blocks of R lines each containing C characters. Each character describes one cell of the dungeon. A cell full of rock is indicated by a '#' and empty cells are represented by a '.'. Your starting position is indicated by 'S' and the
exit by the letter 'E'. There's a single blank line after each level. Input is terminated by three zeroes for L, R and C.
Output
Each maze generates one line of output. If it is possible to reach the exit, print a line of the form
Escaped in x minute(s).
where x is replaced by the shortest time it takes to escape.
If it is not possible to escape, print the line
Trapped!
Sample Input
3 4 5
S....
.###.
.##..
###.#
#####
#####
##.##
##...
#####
#####
#.###
####E
1 3 3
S##
#E#
###
0 0 0
Sample Output
Escaped in 11 minute(s).
Trapped!
题解:最初我试了一下动态规划,结果失败,为什么呢?因为动态规划先做什么后做什么必须明确,而迷宫问题却不知道先算谁后算谁.还是广度优先快.
实现队列非常简单,一定要手动背写下来.
#include<iostream> #include<math.h> #include<stdio.h> #include<string.h> #include<algorithm> #include<time.h> #include<stdlib.h> using namespace std; int a[31][31][31]; char map[31][31][31]; int xsize, ysize, zsize; struct Point{ int x, y, z; }; struct queue{ Point a[10000]; int head, rear; void init(){ head = rear = 0; } void enq(int x,int y ,int z){ Point&p = a[rear]; p.x = x; p.y = y; p.z = z; rear++; rear %= 10000; } Point& deq(){ int temp = head; head++; head %= 10000; return a[temp]; } bool isEmpty(){ return rear == head; } }; queue q; int sx, sy, sz; int ans=-1; void check(int x, int y, int z,int father){ if (x < 0 || y < 0 || z < 0)return; if (x >= xsize || y >= ysize || z >= zsize)return; if (~a[x][y][z])return; if (map[x][y][z] == '#')return; if (map[x][y][z] == 'E'){ ans = father + 1; return; } a[x][y][z] = father + 1; q.enq(x, y, z); } void go(){ memset(a, -1, sizeof(a)); ans = -1; q.init(); q.enq(sx, sy, sz); a[sx][sy][sz] = 0; while (!q.isEmpty()){ Point &p = q.deq(); int&x = p.x; int &y = p.y; int &z = p.z; int &f = a[x][y][z]; check(x + 1, y, z,f); check(x - 1, y, z,f); check(x, y + 1, z,f); check(x, y - 1, z,f); check(x, y, z + 1,f); check(x, y, z - 1,f); if (~ans)return; } } int main(){ while (cin >> xsize >> ysize >> zsize && (xsize || ysize || zsize)){ int i, j, k; for (i = 0; i < xsize; i++){ for (j = 0; j < ysize; j++){ for (k = 0; k < zsize; k++){ cin >> map[i][j][k]; if (map[i][j][k] == 'S'){ sx = i; sy = j; sz = k; a[i][j][k] = -1; } } } } go(); if (ans==-1 ) cout << "Trapped!" << endl; else cout << "Escaped in " << ans << " minute(s)." << endl; } return 0; }