zoukankan      html  css  js  c++  java
  • cdoj1088-王之迷宫 (三维迷宫最短路径)【BFS】

    http://acm.uestc.edu.cn/#/problem/show/1088

    王之迷宫

    Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
     

    王被困在了一个3维的迷宫中,他很想逃离这个迷宫回去当学霸,你能帮助他么? 由于王很仁慈,他悄悄地告诉你,本题读入迷宫的每一行时,要用scanf("%s"...) ......

    Input

    多组测试数据,对于每组测试数据,有三个整数 L,R,C0<l,r,c30)。

    L代表迷宫的高度,RC分别代表每一层的行和列。

    接下来是LR×C的矩阵,矩阵包含4种字符(S,E,.,#),S代表王的初始位置,E代表出口,#代表障碍。.代表能通过的地方。

    每一层之后有一个空行。

    L=R=C=0时,输入中断。

    Output

    如果可以逃离迷宫,按下列格式输出最短时间:

    Escaped in x minute(s). (x表示逃离迷宫的最短时间, 走一步花费一昏钟)

    否则,输出:

    Trapped!

    Sample input and output

    Sample InputSample Output
    3 4 5
    S....
    .###.
    .##..
    ###.#
    
    #####
    #####
    ##.##
    ##...
    
    #####
    #####
    #.###
    ####E
    
    1 3 3
    S##
    #E#
    ###
    
    0 0 0
    Escaped in 11 minute(s).
    Trapped!

    题解:三维迷宫,很简单的bfs。一开始wa了一发,后来发现是因为oj数据不规范,不能用getchar去消除空白符,得用%s过滤空白符。一方面有些抱怨oj数据坑爹,一方面总结教训,要有勇气敢于怀疑平台数据的正确性,改善自己程序的健壮性。

    代码:

     1 #include <fstream>
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <vector>
     5 #include <cstdlib>
     6 #include <cstring>
     7 #include <algorithm>
     8 #include <queue>
     9 
    10 using namespace std;
    11 
    12 struct node{
    13     int x,y,z,step;
    14 }tmp;
    15 
    16 const int N=35;
    17 int l,r,c,x1,y1_,z1;
    18 queue<node> pq;
    19 char a[N][N][N];
    20 bool b[N][N][N];
    21 int co[3][6]={{0,0,0,0,1,-1},{0,0,1,-1,0,0},{1,-1,0,0,0,0}};
    22 
    23 inline bool check(int x,int y,int z);
    24 int bfs();
    25 
    26 int main()
    27 {
    28     //freopen("D:\input.in","r",stdin);
    29     //freopen("D:\output.out","w",stdout);
    30     while(scanf("%d%d%d",&l,&r,&c)&&(l|r|c)){
    31         bool bo=1;
    32         for(int i=0;i<l;i++){
    33             for(int j=0;j<r;j++){
    34                 scanf("%s",a[i][j]);
    35                 if(bo)
    36                     for(int z=0;z<c;z++){
    37                         if(a[i][j][z]=='S'){
    38                             x1=i,y1_=j,z1=z;
    39                             bo=0;
    40                             break;
    41                         }
    42                     }
    43             }
    44         }
    45         int ans=bfs();
    46         if(ans==-1) puts("Trapped!");
    47         else    printf("Escaped in %d minute(s).
    ",ans);
    48     }
    49     return 0;
    50 }
    51 inline bool check(int x,int y,int z){
    52     return x>=0&&x<l&&y>=0&&y<r&&z>=0&&z<c&&a[x][y][z]!='#'&&b[x][y][z]==0;
    53 }
    54 int bfs(){
    55     memset(b,0,sizeof(b));
    56     while(!pq.empty()) pq.pop();
    57     tmp.step=0;
    58     tmp.x=x1;
    59     tmp.y=y1_;
    60     tmp.z=z1;
    61     pq.push(tmp);
    62     b[x1][y1_][z1]=1;
    63     while(!pq.empty()){
    64         tmp=pq.front();
    65         pq.pop();
    66         int x=tmp.x,y=tmp.y,z=tmp.z;
    67         int tx,ty,tz,ts=tmp.step+1;
    68         for(int i=0;i<6;i++){
    69             tx=x+co[0][i];
    70             ty=y+co[1][i];
    71             tz=z+co[2][i];
    72             if(check(tx,ty,tz)){
    73                 b[tx][ty][tz]=1;
    74                 if(a[tx][ty][tz]=='.'){
    75                     tmp.x=tx,tmp.y=ty,tmp.z=tz,tmp.step=ts;
    76                     pq.push(tmp);
    77                 }else{
    78                     return ts;
    79                 }
    80             }
    81         }
    82     }
    83     return -1;
    84 }
  • 相关阅读:
    代码分层之模拟servlet调用dao
    Request对象和Response对象
    jquery-动画
    jquery-easyui
    phpcms
    Ajax做分页
    phpcms安装
    cms替换主页的步骤
    php 复习
    登录验证——————生成随机数
  • 原文地址:https://www.cnblogs.com/jiu0821/p/4557704.html
Copyright © 2011-2022 走看看