这个是一个迷宫问题,首先我们注意到他们的方向,东南西北和上下六个,所以这是一个三维数组所构建的空间立体模型;然后迷宫问题嘛肯定又是bfs遍历,从一个父结点到子结点的依次遍历这里要记得判断是否能成功逃出,然后要保存记录的可以通路的最短路线的节点的信息,所以这里还需要使用队列来记录,数组的话,如果没有确定好容易发生溢出从而导致很多东西都存不进去,最后肯定会出现错误。然后这个遍历的话,要注意相关的判断条件和和行走函数的预判dx[0,0,0,0,1,-1]这个数组主要是为了到时候行走的时候可以保证只走一个方向的节点,通过这整个的dx,dydz的循环就可以确定周围六个方向的通路,然后记录这个走过的点,重新调用自己这个函数,开始递归。在主函数可以通过判断是否通路来减小这个bfs函数的递归调用。减小开销。
#include<stdio.h> #include<queue> #include<string.h> using namespace std; int visit[40][40][40]; int step[40][40][40]; int dx[6]= {0,0,0,0,1,-1}; int dy[6]= {0,0,1,-1,0,0}; int dz[6]= {1,-1,0,0,0,0}; int n,m,k,flag; struct node { int x,y,z; } start,end; int bfs() { flag=0; queue <node> Q; Q.push(start); node temp; visit[start.x][start.y][start.z]=1; while(!Q.empty()) { temp=Q.front(); Q.pop(); if(temp.x==end.x&&temp.y==end.y&&temp.z==end.z) { flag=1; break; } int x=temp.x; int y=temp.y; int z=temp.z; for(int i=0; i<6; i++) { if(!visit[z+dz[i]][x+dx[i]][y+dy[i]]&&x+dx[i]<m&&x+dx[i]>=0&&y+dy[i]<k&&y+dy[i]>=0&&z+dz[i]<n&&z+dz[i]>=0) { temp.x=x+dx[i]; temp.y=y+dy[i]; temp.z=z+dz[i]; visit[temp.z][temp.x][temp.y]=1; Q.push(temp); step[temp.x][temp.y][temp.z]=step[x][y][z]+1; } } } return flag; } int main() { int i,j,t; char ch; while(scanf("%d%d%d",&n,&m,&k)!=EOF) { if(n==0&&m==0&&k==0) break; memset(step,0,sizeof(step)); getchar(); for(i=0; i<n; i++) { for(j=0; j<m; j++) { for(t=0; t<k; t++) { scanf("%c",&ch); if(ch=='.') visit[i][j][t]=0; else if(ch=='#') visit[i][j][t]=1; else if(ch=='S') { visit[i][j][t]=0; start.x=j; start.y=t; start.z=i; } else if(ch=='E') { visit[i][j][t]=0; end.x=j; end.y=t; end.z=i; } } getchar(); } if(i!=n-1) getchar(); } if(bfs()) printf("Escaped in %d minute(s). ",step[end.x][end.y][end.z]); else printf("Trapped! "); } return 0;