三维数组加宽搜
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
const int MAXN=50;
int c, k, h;
char ma[MAXN][MAXN][MAXN]; //定义三维数组 长宽高
int visit[MAXN][MAXN][MAXN]; //标记数组
struct node {
int c, k, h;//结构体记录到达某个点 c长k宽h高
int step;//走的步数
};
struct node t[33433];//结构体队列
struct node p, q, w, l;
int f[][3] = {0,0,1, 0,0,-1, 0,1,0, 0,-1,0, 1,0,0, -1,0,0};//向上下左右前后六个方向移动 包括上楼
void bfs() {
visit[p.c][p.k][p.h] = 1;//标记已经走过
int front = 0, rear = 0;
t[rear++] = p;//入队
while(front!=rear) { //当队列不为空的时候
w = t[front++];
if(w.c==q.c&&w.k==q.k&&w.h==q.h) { //如果是终点,直接输出
printf("Escaped in %d minute(s).\n", w.step);
return ;
}
for(int i=0; i<6; i++) { //否则,遍历六个方向
l = w;
l.c += f[i][0];
l.k += f[i][1];
l.h += f[i][2];
if(l.c>=0&&l.c<c&&l.k>=0&&l.k<k&&l.h>=0&&l.h<h&&ma[l.c][l.k][l.h]!='#'&&visit[l.c][l.k][l.h]==0) { //如果符合条件
l.step++;//步数增加
visit[l.c][l.k][l.h] = 1;//标记访问过了
t[rear++] = l;//入列
}
}
}
printf("Trapped!\n");//否则,输出无法到达
}
int main() {
memset(t, 0, sizeof(struct node)); //先清空
while(~scanf("%d %d %d", &c, &k, &h)) { //c长k宽h高
if(c==0&&k==0&&h==0) break;
for(int i=0; i<c; i++) {
for(int j=0; j<k; j++) {
scanf("%s", ma[i][j]);//按照字符串输入
for(int w = 0; w<h; w++) {
if(ma[i][j][w]=='S') { //记录起点
p.c = i;
p.k = j;
p.h = w;
p.step = 0;
} else if(ma[i][j][w]=='E') { //记录终点
q.c = i;
q.k = j;
q.h = w;
}
}
}
}
memset(visit, 0, sizeof(visit));//清空标记数组
bfs();//广搜
}
return 0;
}