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!
发现队列是一个很好地算法,很多问题通过队列去解决就变得没有那么复杂,是一个值得我好好去研究练习的算法。
这个题目的难度在于三维空间,不好去理解题意,分析去它的坐标变化,然后用结构体,三维数组,队列去处理,问题就好办多了!
#include<stdio.h> #include<queue> #include<string.h> using namespace std; struct data { int x,y,z,step; } pre,cur; int flag,n,m,k,sx,sy,sz,v[120][120][120]; char map[110][110][110]; int dis[6][3]= {{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}}; void BFS() { queue<data>que; cur.x=sx; cur.y=sy; cur.z=sz; cur.step=0; que.push(cur); v[sx][sy][sz]=1; while(!que.empty()) { cur=que.front(); que.pop(); if(map[cur.x][cur.y][cur.z]=='E') { flag=1; printf("Escaped in %d minute(s).\n",cur.step); return ; } for(int i=0; i<6; i++) { pre=cur; pre.x+=dis[i][0]; pre.y+=dis[i][1]; pre.z+=dis[i][2]; if(pre.x>=0&&pre.x<n&&pre.y>=0&&pre.y<m&&pre.z>=0&&pre.z<k&&!v[pre.x][pre.y][pre.z]&&map[pre.x][pre.y][pre.z]!='#') { pre.step+=1; v[pre.x][pre.y][pre.z]=1; que.push(pre); } } } } int main() { while(scanf("%d%d%d",&n,&m,&k)!=EOF) { if(!n&&!m&&!k) break; memset(v,0,sizeof(v)); for(int i=0; i<n; i++) for(int j=0; j<m; j++) { scanf("%s",&map[i][j]); for(int s=0; s<k; s++) if(map[i][j][s]=='S') { sx=i; sy=j; sz=s; } } flag=0; BFS(); if(!flag) printf("Trapped!\n"); } return 0; }