POJ2251

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<queue>
 5 #include<algorithm>
 6 #define N 36
 7 using namespace std;
 8 char map[N][N][N];
 9 int vis[N][N][N];
10 int dx[6]={0,-1,0,1,0,0};
11 int dy[6]={-1,0,1,0,0,0};
12 int dz[6]={0,0,0,0,1,-1};
13 
14 int l,r,c,sx,sy,sz,ans;
15 struct point {
16     int x,y,z;
17     int lev;
18 };
19 point p,pp;
20 queue<point>q;
21 
22 void bfs(){
23     int i,j;
24     p.z=sz;
25     p.x=sx;
26     p.y=sy;
27     p.lev=0;
28     ans=999999;
29     vis[sz][sx][sy]=1;
30     q.push(p);
31     while(!q.empty()){
32         p=q.front();
33         q.pop();
34         pp.x=p.x;
35         pp.y=p.y;
36         pp.x=p.z;
37 
38         if(map[p.z][p.x][p.y]=='E'){
39             if(ans>p.lev)
40             ans=p.lev;
41             while(!q.empty())
42                 q.pop();
43             }
44         for(i=0;i<6;i++){
45             pp.x=p.x+dx[i];
46             pp.y=p.y+dy[i];
47             pp.z=p.z+dz[i];
48             if(pp.x<0||pp.x>=r||pp.y<0||pp.y>=c||pp.z<0||pp.z>=l||vis[pp.z][pp.x][pp.y]==1||map[pp.z][pp.x][pp.y]=='#')
49                 continue;
50             if(map[pp.z][pp.x][pp.y]=='E'){
51                 vis[pp.z][pp.x][pp.y]=1;
52                 pp.lev=p.lev+1;
53                 q.push(pp);
54             }
55             if(map[pp.z][pp.x][pp.y]=='.'){
56                 vis[pp.z][pp.x][pp.y]=1;
57                 pp.lev=p.lev+1;
58                 q.push(pp);
59             }
60         }
61     }
62     if(ans==999999)
63         printf("Trapped!\n");
64     else
65          printf("Escaped in %d minute(s).\n",ans);
66     return ;
67 }
68 
69 int main(){
70     int i,j,k;
71     while(scanf("%d%d%d",&l,&r,&c)==3,l+r+c){
72         memset(map,'#',sizeof(map));
73         memset(vis,0,sizeof(vis));
74         for(k=0;k<l;k++){//层数
75             for(i=0;i<r;i++){//行数
76                 scanf("%s",map[k][i]);
77             }
78             getchar();
79         }
80 
81         for(k=0;k<l;k++)
82             for(i=0;i<r;i++)
83                 for(j=0;j<c;j++){
84                     if(map[k][i][j]=='S'){
85                         sz=k;
86                         sx=i;
87                         sy=j;
88                         break;
89                     }
90                 }
91 
92         bfs();
93     }
94     return 0;
95 }

题目大意: 
 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径

移动方向可以是上,下,左,右,前,后,六个方向

每移动一次就耗费一分钟,要求输出最快的走出时间。
不同L层的地图,相同RC坐标处是连通的

keep moving...
原文地址:https://www.cnblogs.com/xxx0624/p/2613994.html