三维的地图,就是在原先的基础上加了一个方向,即z轴。其他的和二维的广搜一摸一样。
现在这种基础的广搜做的还是比较轻松。
AC code:
#include "iostream" #include "stdio.h" using namespace std; char map[32][32][32]; int res[32][32][32]; int dis[6][3]={{1,0,0},{0,1,0},{0,0,1},{-1,0,0},{0,-1,0},{0,0,-1}}; int n,m,l; struct node //队 { int x,y,z; }r[27005]; bool ok(int x,int y,int z) { return x>0&&y>0&&z>0&&x<=l&&y<=n&&z<=m; } int bfs(int x,int y,int z) { int i,x1,y1,z1; r[0].x=x1=x,r[0].y=y1=y,r[0].z=z1=z; int head=0,tail=1; res[x1][y1][z1]=0; while( head!=tail) { x1=r[head].x, y1=r[head].y, z1=r[head].z; for(i=0; i<6; i++) { x1+=dis[i][0],y1+=dis[i][1],z1+=dis[i][2]; if(ok(x1,y1,z1) && res[x1][y1][z1]==-1 && (map[x1][y1][z1]=='.' || map[x1][y1][z1]=='E')) { r[tail].x=x1,r[tail].y=y1,r[tail].z=z1; res[x1][y1][z1]=1+res[x1-dis[i][0]][y1-dis[i][1]][z1-dis[i][2]]; tail++; } x1-=dis[i][0],y1-=dis[i][1],z1-=dis[i][2]; } head++; } } int main() { int i,j,e,sx,sy,sz,ex,ey,ez; while(scanf("%d%d%d",&l,&n,&m)!=EOF && l||n||m) { for(e=1; e<=l; e++) { for(i=1; i<=n; i++) { for(j=1; j<=m; j++) { res[e][i][j]=-1; cin>>map[e][i][j]; if(map[e][i][j]=='S') sx=e,sy=i,sz=j; if(map[e][i][j]=='E') ex=e,ey=i,ez=j; } } } bfs(sx,sy,sz); if(res[ex][ey][ez] != -1) printf("Escaped in %d minute(s)./n",res[ex][ey][ez]); else printf("Trapped!/n"); } system("pause"); return 0; }