[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] = {{ - 1、0、0 }、{ 1、0、0 }、{ 0 - 1、0 }、{ 0、1、0 }、{ 0、0 - 1 }、{ 0、0、1 }}; // 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 。 }