Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 22503 | Accepted: 8787 |
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!
Source
不用剪枝的图搜,思路还是比较简单的,只不过从二维图变成了三维图,这里初始化都要用三维的就行了,二维的走法是4种,三维的走法是六种,上下左右前后,思路很好写,直接就能1A 注意数组不要开太大,POJ的范围给的还是蛮准的。
这里直接上AC代码:
#include<stdio.h> #include<string.h> #include<queue> using namespace std; struct zuobiao { int x,y,z; }now,nex; int q,n,m; char a[32][32][32]; int vis[32][32][32]; int output[32][32][32]; int fx[6] = {0, 0, 0, 0, 1, -1}; int fy[6] = {0, 0, 1, -1, 0, 0}; int fz[6] = {1, -1, 0, 0, 0, 0}; void bfs(int x,int y,int z) { memset(vis,0,sizeof(vis)); memset(output,0,sizeof(output)); vis[x][y][z]=1; now.x=x; now.y=y; now.z=z; queue<zuobiao >s; s.push(now); while(!s.empty()) { now=s.front(); if(a[now.x][now.y][now.z]=='E') { //printf("%d\n",output[nex.x][nex.y][nex.z]); return ; } s.pop(); for(int i=0;i<6;i++) { nex.x=now.x+fx[i]; nex.y=now.y+fy[i]; nex.z=now.z+fz[i]; if(nex.x>=0&&nex.x<q&&nex.y>=0&&nex.y<n&&nex.z>=0&&nex.z<m&&vis[nex.x][nex.y][nex.z]==0&&a[nex.x][nex.y][nex.z]!='#') { output[nex.x][nex.y][nex.z]=output[now.x][now.y][now.z]+1; vis[nex.x][nex.y][nex.z]=1; s.push(nex); } } } return ; //printf("no\n"); } int main() { while(~scanf("%d%d%d",&q,&n,&m)) { if(q==0&&n==0&&m==0)break; int x,y,z; int ex,ey,ez; for(int i=0;i<q;i++) { for(int j=0;j<n;j++) { scanf("%s",a[i][j]); for(int k=0;k<m;k++) { if(a[i][j][k]=='S') { x=i; y=j; z=k; } if(a[i][j][k]=='E') { ex=i; ey=j; ez=k; } } } } bfs(x,y,z); if(output[ex][ey][ez]==0){printf("Trapped!\n");continue;} printf("Escaped in %d minute(s).\n",output[ex][ey][ez]); } }