Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 23073 | Accepted: 8981 |
Description
Input
Output
Escaped in x minute(s).
Trapped!
Sample Input
3 4 5 S.... .###. .##.. ###.# ##### ##### ##.## ##... ##### ##### #.### ####E 1 3 3 S## #E# ### 0 0 0
Sample Output
Escaped in 11 minute(s). Trapped! 题目大意: 一个3D的地牢内有多个房间,在这个地牢内可以按照东,西,南,北,上,下方向移动,问从地牢的S房间要走到E房间最小时间花费多少。。相对与之前的广度搜 索这道题多了上下两个方向,可以定义一个三维数组map【】【】【】来存储。 上代码: #include <iostream> #include<stdio.h> #include<string.h> #include<queue> using namespace std; int map[35][35][35],vis[35][35][35],step[35][35][35]; int sx,sy,sz,ex,ey,ez,flag,l,r,c; int fx[]={1,-1,0,0,0,0}; int fy[]={0,0,1,-1,0,0}; int fz[]={0,0,0,0,1,-1}; void bfs(int x,int y,int z) { int i; queue<int>q; while(!q.empty()) { q.pop(); } vis[x][y][z]=1; q.push(x); q.push(y); q.push(z); while(!q.empty()) { int xx=q.front(); q.pop(); int yy=q.front(); q.pop(); int zz=q.front(); q.pop(); if(xx==ex&&yy==ey&&zz==ez) { flag=1; return; } for(i=0;i<6;i++) { x=xx+fx[i]; y=yy+fy[i]; z=zz+fz[i]; if(map[x][y][z]&&!vis[x][y][z]&&x>=0&&x<l&&y>=0&&y<r&&z>=0&&z<c) { step[x][y][z]=step[xx][yy][zz]+1; vis[x][y][z]=1; q.push(x); q.push(y); q.push(z); } } } } int main() { int i,j,k; char cc; while(cin>>l>>r>>c&&l&&r&&c) { flag=0; memset(vis,0,sizeof(vis)); memset(step,0,sizeof(step)); memset(map,0,sizeof(map)); for(i=0; i<l; i++) { for(j=0; j<r; j++) { for(k=0; k<c; k++) { cin>>cc; if(cc=='#') { map[i][j][k]=0; } else { map[i][j][k]=1; if(cc=='S') { sx=i; sy=j; sz=k; } else if(cc=='E') { ex=i; ey=j; ez=k; } } } } getchar(); } bfs(sx,sy,sz); if(flag==1) { cout<<"Escaped in "<< step[ex][ey][ez]<<" minute(s)."<<endl; } else { cout<<"Trapped!"<<endl; } } return 0; }