Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 17444 | Accepted: 6790 |
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!
传送门
题意:某动物被困在三维的地下城里,起点是S,终点是E问他能不能逃跑,能逃最快需要几分钟。
思路:简单的bfs,三维就是二维的小升级,所以nxt数组要加一个上下移动的步骤,三维map即可
//272K 32MS #include<cstdio> #include<cstring> #include<queue> using namespace std; int l,r,c,flag; char mapp[35][35][35]; bool book[35][35][35]; struct point{ int z; int x; int y; int t; }; int nx[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}}; //加两个上下移动的操作 queue<point> que; point s; void ini() { flag=0; memset(mapp,-1,sizeof(mapp));//把mapp初始化成-1,图的外界部分都是小于0的数所以判断边界就变得简单了 memset(book,0,sizeof(book)); for(int k=1;k<=l;k++){ for(int i=1;i<=r;i++){ for(int j=1;j<=c;j++){ scanf("%c",&mapp[k][i][j]); if(mapp[k][i][j]=='S') s.z=k,s.x=i,s.y=j,s.t=0; } getchar(); //对这种字符的读入要格外注意换行符的读入问题 } getchar(); } while(!que.empty()) que.pop(); } void bfs() { que.push(s); book[s.z][s.x][s.y]=1; while(!que.empty()){ point tmp=que.front(); que.pop(); if(mapp[tmp.z][tmp.x][tmp.y]=='E'){flag=1;printf("Escaped in %d minute(s).\n",tmp.t);return;} point nxt;int a,b,c; for(int i=0;i<6;i++){ a=tmp.z+nx[i][0],b=tmp.x+nx[i][1],c=tmp.y+nx[i][2]; if(mapp[a][b][c]<0||mapp[a][b][c]=='#'||book[a][b][c]) continue; nxt.z=a,nxt.x=b,nxt.y=c,nxt.t=tmp.t+1; que.push(nxt); book[a][b][c]=1; } } } int main() { while(~scanf("%d%d%d",&l,&r,&c)&&(l||r||c)){ getchar(); ini(); bfs(); if(!flag) printf("Trapped!\n"); } return 0; }