Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 20940 | Accepted: 8118 |
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表示出口。问是否能跑到出口,若能,输出最小时间。
很基础的bfs,就是加上三维地图的概念,用三维数组解决就可以了,代码如下:
<span style="font-size:12px;">#include<cstdio> #include<queue> using namespace std; int L,R,C,ans,z,x,y,ez,ex,ey,mark[32][32][32]; char map[32][32][32]; int dir[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}}; struct node { int z,x,y,step; }a,temp; int ok(node temp) { if(temp.z<0||temp.z>=L) return 0; if(temp.x<0||temp.x>=R) return 0; if(temp.y<0||temp.y>=C) return 0; if(map[temp.z][temp.x][temp.y]=='#') return 0; if(temp.step>=ans) return 0; return 1; } void bfs() { int i; a.z=z; a.x=x; a.y=y; a.step=0; queue<node>q; q.push(a); while(!q.empty()) { a=q.front(); q.pop(); for(i=0;i<6;i++) { temp.z=a.z+dir[i][0]; temp.x=a.x+dir[i][1]; temp.y=a.y+dir[i][2]; temp.step=a.step+1; if(ok(temp)) { if(temp.z==ez&&temp.x==ex&&temp.y==ey) ans=temp.step; map[temp.z][temp.x][temp.y]='#'; q.push(temp); } } } } int main() { int i,j,k; while(scanf("%d%d%d",&L,&R,&C)&&L||R||C) { for(i=0;i<L;i++) { for(j=0;j<R;j++) { scanf("%s",map[i][j]); for(k=0;k<C;k++) { if(map[i][j][k]=='S') { z=i; x=j; y=k; } if(map[i][j][k]=='E') { ez=i; ex=j; ey=k; } } } } ans=30000; bfs(); if(ans==30000) printf("Trapped!\n"); else printf("Escaped in %d minute(s).\n",ans); } return 0; }</span>