三维数组加宽搜
#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). ", 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! ");//否则,输出无法到达 } 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; }