Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 13923 | Accepted: 5424 |
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!
这道题最坑人的地方在于poj上将他分类为dfs,结果一写就超时,其实写最短路一般肯定是bfs,哎,经验还是太浅了。
这道题还有一个值得注意的地方就是这是个3维的迷宫,只需要加上上下两个方向就行了,其他的就是简单的bfs。
这道题wa了半天,居然是我忘记把文件输入输出那句话给删了,尼玛!
下面是代码:
#include <cstdio> #include <cstring> #include <iostream> #define pan(a,b,c) (a<=b&&b<=c) using namespace std; int dir[6][3]={{0,0,-1},{0,0,1},{-1,0,0},{1,0,0},{0,-1,0},{0,1,0}}; char map[35][35][35]; int vis[35][35][35]; int t,m,n,flag; struct node{ int x,y,z; int num; }que[30010]; void bfs(int sx,int sy,int sz){ int head=0; int tail=1; que[0].x=sx; que[0].y=sy; que[0].z=sz; que[0].num=0; vis[sx][sy][sz]=1; flag=0; int xx,yy,zz; while(head<tail){ for(int i=0;i<6;i++){ xx=que[head].x+dir[i][0]; yy=que[head].y+dir[i][1]; zz=que[head].z+dir[i][2]; if(map[xx][yy][zz]=='E'){//搜到终点 printf("Escaped in %d minute(s).\n",que[head].num+1); flag=1; break; } if(pan(1,xx,t)&&pan(1,yy,m)&&pan(1,zz,n)&&vis[xx][yy][zz]==0&&map[xx][yy][zz]=='.'){//如果在迷宫内,并且未走过 que[tail].x=xx; que[tail].y=yy; que[tail].z=zz; que[tail].num=que[head].num+1; vis[xx][yy][zz]=1; tail++; } } if(flag) break; head++;//flag不为1,那就要在继续往后走 } if(!flag) cout<<"Trapped!"<<endl; } int main(){ //freopen("input.txt","r",stdin); //freopen("output.txt","w",stdout); int i,j,k; int sx,sy,sz; while(scanf("%d%d%d",&t,&m,&n)!=EOF){ if(t==0&&m==0&&n==0) break; for(i=1;i<=t;i++) for(j=1;j<=m;j++) for(k=1;k<=n;k++){ cin>>map[i][j][k]; if(map[i][j][k]=='S'){//找到起点 sx=i; sy=j; sz=k; } } memset(vis,0,sizeof(vis)); bfs(sx,sy,sz); } return 0; }