3D dungeon
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
输入
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.
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!
3 4 5 S.... .###. .##.. ###.# ##### ##### ##.## ##... ##### ##### #.### ####E 1 3 3 S## #E# ### 0 0 0
Escaped in 11 minute(s). Trapped!
题目大意是:以S为起点,问你能否逃出三维牢房(到达E即为逃出),能则输出最短时间,每次只能上下前后左右移动一个位置,移动一个次用时1.
BFS即可AC
AC代码:
#include <stdio.h>
char map[31][31][31], mark[31][31][31];
int i, j, k, L, R, C, Z, Y, X, b[30000][4];
int next[6][3]= {{0,0,-1},{0,1,0},{0,0,1},{0,-1,0},{-1,0,0},{1,0,0}};
int bfs() {
k = 0, j = 1, b[0][3] = 0;
int z,y,x;
while(k < j) {
z = b[k][0], y = b[k][1], x = b[k][2];
for(int p = 0; p < 6; p++) {
Z = z+next[p][0];
Y = y+next[p][1];
X = x+next[p][2];
if(Z>=0&&Y>=0&&X>=0&&Z<L&&Y<R&&X<C) {
if(map[Z][Y][X]=='.'&&mark[Z][Y][X]==0) {
mark[Z][Y][X] = 1;
b[j][0] = Z;
b[j][1] = Y;
b[j][2] = X;
b[j++][3] = b[k][3]+1;
} else if(map[Z][Y][X]=='E') return b[k][3]+1;
}
}
k++;
}
return 0;
}
int main() {
while(scanf("%d %d %d", &L, &R, &C) && (L||R||C)) {
for(i = 0; i < L; i++) {
for(j = 0; j < R; j++) {
for(k = 0; k < C; k++) {
scanf(" %c", &map[i][j][k]);
mark[i][j][k] = 0;
if(map[i][j][k] == 'S') {
b[0][0] = i;
b[0][1] = j;
b[0][2] = k;
mark[i][j][k] = 1;
}
}
}
}
i = bfs();
if(i) printf("Escaped in %d minute(s).\n", i);
else printf("Trapped!\n");
}
return 0;
}