• 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...
  • 相关阅读:
    BZOJ 1176: [Balkan2007]Mokia
    BZOJ 4034: [HAOI2015]T2
    BZOJ 4031: [HEOI2015]小Z的房间
    BZOJ 4128: Matrix
    JSP学习-08-JavaBean
    JSP学习-标准标签库
    电影剧本写作基础
    JSP学习-09-自定义标签
    JSP学习-07Cookie 与Session
    JSP学习-06过滤器
  • 原文地址:https://www.cnblogs.com/xxx0624/p/2613994.html
Copyright © 2020-2023  润新知