E - ダンジョンマスターBFS

[NWUACM] 
あなたは三次元空間に閉じ込められている、そして今、あなたは脱出するために最短経路を見つけたいです!
スペースは、キューブユニットで構成されてい
ますが、分取るように上下1つのユニット、動き回るたびに
あなたが対角線と完全に囲まれて移動することはできません
があれば脱出の可能性?もしそうなら、あなたはどのくらいの時間が必要ですか?

入力 - 入力

  最初の入力ライン番号はスペースの数を示します。
  まず、各空間L、R及びC(いずれも30以上)の動作を説明。
  Lは、空間の高さを表しています。
  C及びRは、それぞれの空間のそれぞれ行と列のサイズを表します。
  次に、層Lダンジョン、各R行、行あたりのCの文字。
  各文字は、単位空間を表しています。「#」は単位で表されていない、「」空白のセルを表します。「S」、輸出「E」であなたの開始位置。
  各スペースの後1つの空白行を持っています。L、R及びCは、すべて0の入力端です。

出力 - 出力

  各出力行はスペースに対応しています。

  脱出した場合、出力は以下の

X(S)でエスケープ分。

  最短時間からXを。



  あなたは脱出することができない場合、出力は以下の

トラップされました!

サンプル入力 - 入力サンプル

3つの4 5 
S ... 
。###。
。## ... 
###。#
##### ##### ##。## ## ... ##### ##### #。### #### E 1 3 3 O ## 及び# ### 0 0 0

サンプル出力 - 出力サンプル

11分には(S)脱出した。
閉じ込められた!

思考:このトピックは設定さ方向のBFS 6方向で,,終わりを見つけるために、出発点を見つけ、それはBFS

#include <iostreamの> 
する#include <キュー> 
の#include <cstdioを>  
する#include <cstdioを> 
する#include <CStringの>
 に#define N 33
 // INT基地[6] [3] = {{-1,0,0}、 {1,0,0}、{0、-1,0}、{0,1,0}、{0,0、-1}、{0,0,1}}。
使用して 名前空間はstdを、
int型、L、N、M。
チャーARR [N] [N] [N]。
int型のマーク[N] [N] [N]。
int型のSA、SB、SC;
int型のEA、EB、EC;
構造体{STU
     INT ; //坐标、B、C
     INT ; S //距离
E1、E2、E3}。
INT  基地 [ 6 ] [ 3] = {{ - 100 }、{ 100 }、{ 0 - 10 }、{ 010 }、{ 00 - 1 }、{ 001 }}; // 6つの方向が
 無効BFS(){ 
    memsetの(マーク、0はsizeof (商標))
    キュー <STU> S; 
    e1.a = SA、SB = e1.b、e1.c = SCを; 
    e1.s = 0; 
    s.push(E1)。
    マーク[SA] [SB] [SC] = 1 
    
    int型 ANS = - 1 ;
    一方、(s.size()){ 
        E2 = s.front()。
        s.pop(); 
        もし(e2.a == EA && e2.b == && e2.c == EB EC)//判断是否到达了终点
        { 
            ANS = e2.s。
            破ります; 
        } 
        のためにint型 i = 0 ; iは< 6 ; iは++ ){ 
            e3.a = e2.a + ベースを [I] [ 0 ]。
            e3.b = e2.b +基地 [I] [ 1 ]。
            e3.c = e2.c + 塩基 [I] [ 2 ]。
            もし((e3.a> = 0)&&(e3.a <L)&&(e3.b> = 0)&&(e3.b <N)&&(e3.c> = 0)&&(e3.c < M)
              &&(!マーク[e3.a] [e3.b] [e3.c])&&(ARR [e3.a] [e3.b] [e3.c] == ' ' || ARR [E3 .A] [e3.b] [e3.c] == ' E ' ))
            { 
                e3.s = e2.s + 1 
                マーク[e3.a] [e3.b] [e3.c] = 1 
             
        } 
    }
     もし(ANS == - 1 ){ 
        COUT << " 追い込まれた!" << ENDL。
    } 
    { 
        のprintf(" %d個分(S)でエスケープ\ N。" 、ANS)。
    } 
} 

int型のmain()
{ 
    一方(CIN >> L >> N >> M){
         場合(N == 0 && m個の== 0 && Lの== 0 破ります以下のためにint型 I = 0 iはL <;ためINT J = 0 ; J <nであり、j ++ ){ 
                scanf関数(" %がS "、およびARR [I] [J])。
            } 
        } 
        のためのint型 I = 0 ; iがLに<I ++は{)
             のためのINT J = 0 ; J <nであり、j ++ ){
                 ためint型のk = 0 ; <M kは、k個++ ){
                     場合(ARR [I] [J] [K] == ' S ' 
                    {
                        SA = I; 
                        SB = J; 
                        SC = K。
                    } 
                    そう であれば(ARR [I] [J] [K] == ' E ' ){ 
                        EA = I。
                        EB = J; 
                        EC = K。
                    } 
                } 
            } 
        } 
        BFS()。
    } 
    戻り 0 
}

 




おすすめ

転載: www.cnblogs.com/Accepting/p/11241617.html