还是比着葫芦画瓢,按照UVA439的思路,只是把二维的数组改成三维的,因为对u的计算马虎了,、wa了6,7次,,55555555,太马虎了。
#include<cstdio> #include<cstdlib> #include<cstring> using namespace std; int dist[35][35][35],vis[35][35][35],q[50003],m,r,c; int dx[]= {1,-1,0,0,0,0}; int dy[]= {0,0,1,-1,0,0}; int dz[]= {0,0,0,0,1,-1}; int x1,y1,z1,x2,y2,z2; char maze[35][35][35]; void bfs(int x,int y,int z) { int front=0,rear=0,d,u; u=z*(r*c)+y*c+x; vis[z][y][x]=1; dist[z][y][x]=0; q[rear++]=u; while(front<rear) { u=q[front++]; z=u/(r*c); y=(u-(r*c)*z)/c; x=(u-(r*c)*z)%c; for(d=0; d<6; d++) { int nx=x+dx[d],ny=y+dy[d],nz=z+dz[d]; if(nx>=0&&nx<c&&ny>=0&&ny<r&&nz>=0&&nz<m&&!vis[nz][ny][nx]&&maze[nz][ny][nx]!='#') { int v=nz*(r*c)+ny*c+nx; q[rear++]=v; vis[nz][ny][nx]=1; dist[nz][ny][nx]=dist[z][y][x]+1; if(nx==x2&&ny==y2&&nz==z2) return ; } } } } int main() { while(scanf("%d%d%d",&m,&r,&c)&&(m||r||c)) { memset(dist,0,sizeof(dist)); memset(vis,0,sizeof(vis)); getchar(); for(int i=0; i<m; i++) { for(int j=0; j<r; j++) { for(int k=0; k<c; k++) { scanf("%c",&maze[i][j][k]); if(maze[i][j][k]=='S') { x1=k; y1=j; z1=i; } else if(maze[i][j][k]=='E') { x2=k; y2=j; z2=i; } } getchar(); } getchar(); } bfs(x1,y1,z1); /* for(int i=0;i<m;i++) { for(int j=0;j<r;j++) { for(int k=0;k<c;k++) printf("%d ",dist[i][j][k]); putchar('\n'); } }*/ if(vis[z2][y2][x2]==1) printf("Escaped in %d minute(s).\n",dist[z2][y2][x2]); if(vis[z2][y2][x2]==0) printf("Trapped!\n"); } return 0; }