【题目大意】
给你一个三维的迷宫,让你计算从入口走到出口最少步数。
【题目分析】
其实和二维迷宫还是一样的,还是用队列来做,由于BFS算法一般是不需要回溯的,所以我们就用不着还用一个visit数组来记录是否访问过,直接将走过的结点置为不可走就可。

//Memory Time // 356K 32MS #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<queue> #include<algorithm> using namespace std; struct Node { int x,y,z; int step; }; queue<Node> que; char Map[50][50][50]; int sx,sy,sz; int ex,ey,ez; int dir_x[]={-1,1,0,0,0,0}; int dir_y[]={0,0,-1,1,0,0}; int dir_z[]={0,0,0,0,1,-1}; void read(int n,int row,int col) { int i,j,k; for(i=0;i<n;i++) { for(j=0;j<row;j++) { for(k=0;k<col;k++) { cin>>Map[i][j][k]; if(Map[i][j][k]=='S') { sx=i; sy=j; sz=k; } else if(Map[i][j][k]=='E') { ex=i; ey=j; ez=k; } } getchar(); } getchar(); } } void BFS() { Node q; q.x=sx; q.y=sy; q.z=sz; q.step=0; que.push(q); while(!que.empty()) { Node tp=que.front(); que.pop(); int x=tp.x; int y=tp.y; int z=tp.z; int step=tp.step; for(int i=0;i<6;i++) { int tx=x+dir_x[i]; int ty=y+dir_y[i]; int tz=z+dir_z[i]; if(Map[tx][ty][tz]=='.') { Node Q; Q.x=tx; Q.y=ty; Q.z=tz; Q.step=step+1; que.push(Q); Map[tx][ty][tz]='#'; } else if(tx==ex&&ty==ey&&tz==ez) { cout<<"Escaped in "<<step+1<<" minute(s)."<<endl; return; } } } cout<<"Trapped!"<<endl; } int main() { // freopen("cin.txt", "r", stdin); int i, j, k; int n,row,col; while(cin>>n>>row>>col&&(n+row+col)) { while(!que.empty()) que.pop(); getchar(); read(n,row,col); BFS(); } return 0; }