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 <string.h> #include <queue> #include <stack> #include <algorithm> using namespace std; #define M 45 #define inf 0x6ffffff char map[M][M][M]; int vis[M][M][M]; int dir[6][3]={{0,1,0},{0,-1,0},{1,0,0},{-1,0,0},{0,0,1},{0,0,-1}};//六个方向 int n,m,ok,k; struct node { int x,y,z; int time; } ; node f[666]; int ztime; int z2,x2,y2,z1,x1,y1; void bfs() { int i; queue<node>q; node st,ed; st.x=x1; st.y=y1; st.z=z1; st.time=0; q.push(st); while(!q.empty()) { st=q.front(); q.pop(); if(st.x==x2 &&st.y==y2 &&st.z==z2) { ok=1; ztime=st.time; return; } for(i=0;i<6;i++) { ed.x=st.x+dir[i][0]; ed.y=st.y+dir[i][1]; ed.z=st.z+dir[i][2]; if(map[ed.x][ed.y][ed.z]=='#' ||vis[ed.x][ed.y][ed.z] ||ed.x<0 ||ed.x>=k ||ed.y<0 ||ed.y>=n ||ed.z<0||ed.z>=m)//越界,搜过的地方,墙全部排除 continue; ed.time=st.time+1; //时间加一 vis[ed.x][ed.y][ed.z]=1; q.push(ed); } } return; } int main() { int i,j,r; while(scanf("%d%d%d",&k,&n,&m)!=EOF &&k!=0 &&n!=0 &&m!=0) { ok=0; memset(vis,0,sizeof(vis)); for(i=0;i<k;i++) for(j=0;j<n;j++) //我把j++写成i++找了一天的错误。。无语。 { scanf("%s",map[i][j]);//输入地图 for(r=0;r<m;r++) { if(map[i][j][r]=='S') { z1=r; x1=i; y1=j; } else if(map[i][j][r]=='E') { z2=r; x2=i; y2=j; } } } vis[x1][y1][z1]=1; bfs(); // printf("%d\n",ok); if(!ok) printf("Trapped!\n"); //后面有!。这里WA了一次。 else printf("Escaped in %d minute(s).\n",ztime);//改了上面之后,这里后面有个点,又WA了一次。 ORZ。 } return 0; }
原文地址:http://blog.csdn.net/sky_miange/article/details/43491359