Dungeon Master

这个相当于在 最少步数 的基础上增加了一些约束条件。

也就是不需要给所有点确定最短路径,只需要在有意义的点上确定就行。

因为最短路径(数值)和迷宫(字符)使用了两种不同的表示方式,所以最好使用两个数组搭配求解。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<queue>
 5 using namespace std;
 6 const int N=105;
 7 
 8 int l,r,c,a[N][N][N],t[]={-1,1,0,0,0,0,0,0,-1,1,0,0,0,0,0,0,1,-1};
 9 char cc[N][N][N];
10 queue<int> q;
11 void bfs(){
12     while(!q.empty()){
13         int z=q.front();
14         q.pop();
15         int x=q.front();
16         q.pop();
17         int y=q.front();
18         q.pop();
19         for(int i=0;i<6;i++){
20             int ni=x+t[i],nj=y+t[i+6],nk=z+t[i+12];
21             if(ni>0&&ni<=r&&nj>0&&nj<=c&&nk>0&&nk<=l&&cc[nk][ni][nj]!='#'&&(a[nk][ni][nj]>a[z][x][y]+1||!a[nk][ni][nj])){
22                 q.push(nk),q.push(ni),q.push(nj);
23                 a[nk][ni][nj]=a[z][x][y]+1;
24             }    
25         }
26     }
27 }
28 int main(){
29     int x,y,z;
30     while(cin>>l>>r>>c){
31         getchar();//接收换行符
32         if(!l&&!r&&!c)break;
33         for(int i=1;i<=l;i++)
34             for(int j=1;j<=r;j++){
35                 for(int k=1;k<=c;k++){
36                     scanf("%c",&cc[i][j][k]);
37                     if(cc[i][j][k]=='S')
38                         q.push(i),q.push(j),q.push(k);
39                     if(cc[i][j][k]=='E')
40                         z=i,x=j,y=k;
41                 }
42                 getchar();
43             }
44         memset(a,0,sizeof(a));
45         bfs();
46         if(a[z][x][y])printf("Escaped in %d minute(s).\n",a[z][x][y]);
47         else printf("Trapped!\n");
48     }     
49     return 0;
50 }