Input
The input consists of a number of dungeons. Each dungeon description starts with a line containing three integers L, R and C (all limited to 30 in size). L is the number of levels making up the dungeon. R and C are the number of rows and columns making up the plan of each level. Then there will follow L blocks of R lines each containing C characters. Each character describes one cell of the dungeon. A cell full of rock is indicated by a '#' and empty cells are represented by a '.'. Your starting position is indicated by 'S' and the exit by the letter 'E'. There's a single blank line after each level. Input is terminated by three zeroes for L, R and C.Output
Each maze generates one line of output. If it is possible to reach the exit, print a line of the form Escaped in x minute(s). where x is replaced by the shortest time it takes to escape. If it is not possible to escape, print the line Trapped!Sample Input
3 4 5 S.... .###. .##.. ###.# ##### ##### ##.## ##... ##### ##### #.### ####E 1 3 3 S## #E# ### 0 0 0Sample Output
Escaped in 11 minute(s). Trapped!之前做过类似的A计划,那道题是二维传送地图,当时是用DFS写的。这次的Dungeon Master是A计划的升级版,达到30的多维地图(WA:只能传送到相邻维度。。),所以尝试DFS果断超时,,然后重码了一遍BFS-_-16msA掉。这再一次地证明了在处理最短路径时BFS的效率之高。DFS TLE代码: #include<stdio.h> #include<string.h> char a[35][35][35]; int b[35][35][35]; int t[6][3]={{0,1,0},{0,0,1},{0,-1,0},{0,0,-1},{1,0,0},{-1,0,0}}; int ww,n,m,bw,bx,by,min; void dfs(int w,int x,int y,int s) { int i; if(w<0||x<0||y<0||w>=ww||x>=n||y>=m) return; if(a[w][x][y]=='E'){ if(s<min) min=s; return; } if(a[w][x][y]=='#'||b[w][x][y]==1) return; for(i=0;i<6;i++){ int tw=w+t[i][0]; int tx=x+t[i][1]; int ty=y+t[i][2]; b[w][x][y]=1; dfs(tw,tx,ty,s+1); b[w][x][y]=0; } } int main() { int i,j,k; while(scanf("%d%d%d",&ww,&n,&m)&&!(ww==0&&n==0&&m==0)){ for(i=0;i<ww;i++){ for(j=0;j<n;j++){ getchar(); scanf("%s",a[i][j]); for(k=0;k<m;k++){ if(a[i][j][k]=='S'){ bw=i; bx=j; by=k; } } } } min=1000000000; memset(b,0,sizeof(b)); dfs(bw,bx,by,0); if(min==1000000000) printf("Trapped!\n"); else printf("Escaped in %d minute(s).\n",min); } return 0; }BFS AC代码:
#include<stdio.h> #include<string.h> #include<queue> using namespace std; char a[35][35][35]; int b[35][35][35]; int t[6][3]={{0,1,0},{0,0,1},{0,-1,0},{0,0,-1},{1,0,0},{-1,0,0}}; struct Node{ int w,x,y,s; }node; int main() { int ww,n,m,i,j,k; while(scanf("%d%d%d",&ww,&n,&m)&&!(ww==0&&n==0&&m==0)){ queue<Node> q; memset(b,0,sizeof(b)); for(i=0;i<ww;i++){ for(j=0;j<n;j++){ getchar(); scanf("%s",a[i][j]); for(k=0;k<m;k++){ if(a[i][j][k]=='S'){ b[i][j][k]=1; node.w=i; node.x=j; node.y=k; node.s=0; q.push(node); } } } } int f=0; while(q.size()){ for(i=0;i<6;i++){ int tw=q.front().w+t[i][0]; int tx=q.front().x+t[i][1]; int ty=q.front().y+t[i][2]; if(tw<0||tx<0||ty<0||tw>=ww||tx>=n||ty>=m) continue; if(a[tw][tx][ty]=='E'){ f=q.front().s+1; break; } if(a[tw][tx][ty]=='#'||b[tw][tx][ty]==1) continue; b[tw][tx][ty]=1; node.w=tw; node.x=tx; node.y=ty; node.s=q.front().s+1; q.push(node); } if(f!=0) break; q.pop(); } if(f==0) printf("Trapped!\n"); else printf("Escaped in %d minute(s).\n",f); } return 0; }
转载于:https://www.cnblogs.com/yzm10/p/7240302.html
