HDU - 1253大脱走(検索)

イグナチオは、これは良い機会イグナチオエスケープで、悪魔に奪われ、悪魔一日の出張た。 

悪魔城に住んでいた、城はA * B * Cキューブである、それはAのB * Cのように表すことができます。マトリックスは、イグナティウスは、城(A-1、B-1から離れた位置でのドアの開始(0,0,0)の位置に保持し 、C-1) 、及び今T後悪魔分を既知の城に戻ります、イグナチオそのうちの一つの座標隣接する6点の座標から徒歩5分ですが。あなたは、城のマップを与えられている、あなたは、限り、輸出も城を残していったとして(主は戻ってくる前に、イグナチオは城を左に計算することができますあなたは悪魔がちょうど戻ってきたときに終了するようになった場合は大成功と見なすことができる)、そして、あなたの出力ニーズが残して何分そうであれば、そうでない場合は、出力-1。 

 

入力

各テストの最初の行は、4つの正の整数A、B、C、およびT(1 <= A、Bであることを示す入力データの最初の行は、正の整数K、試験データの数であり 、C <= 50 、1 <= T <= 1000 )、 バック時に大きさと城悪魔を表す。ブロックは、入力データである(第一、最初のブロックをブロック0、第二のブロック......)各ブロックB 0は、チャネル1を表す迷路のレイアウトを表すC正の整数とそれぞれが壁を表す(そうでない場合は入力の明確な記述が、表す、入力迷路をサンプリングするために参照して説明することができ、データ入力ラインを有しています上記の画像は迷路です) 

特別な注意:テストデータこの問題のためのscanf入力を使用し、非常に大きいですが、私はCINはタイムアウトを使用することはできません保証は、Visual C ++このOJで提出を使用することはできません。.. 

出力

各テストでは、主の前に城を残すことができイグナチオが戻ってくる場合は、その後、彼の出力は最小分の数、または出力を必要と-1。 

サンプル入力

1 
3 3 4 20 
0 1 1 1 
0 0 1 1 
0 1 1 1 
1 1 1 1 
1 0 0 1 
0 1 1 1 
0 0 0 0 
0 1 1 0 
0 1 1 0

サンプル出力

11

三次元の検索、データの量は、プルーンと時間を最適化するために、T時間以下で使用していません。

そのため、入力の複数のセット注意リターン0、WA 7回とそう。

#include <iostreamの> 
する#include <キュー> 
の#include <アルゴリズム> 
の#include < 設定 > 
の#include <cmath> 
の#include <ベクトル> 
の#include <地図> 
の#include <スタック> 
の#include <ビットセット> 
の#include <cstdioを>
 #defineスワップ(a、b)はA 2 = B ^ = A ^ = B用
 の#define CINI(N)のscanf( "%d個"、&N)
 の#define CINL(N)のscanf( "%のLLD"、&N)
 の#define CINC(N)のscanf( "%のC"、&N)
 の#define coui(N)のprintf( "%d個"、N)
 の#define couc(N)のprintf( "%のC"、
N) の#defineクーロン(N)のprintf( "%のLLD"、N)
 の#defineスピードios_base :: sync_with_stdio(0);
#define MAX(a、b)はA> B A:B?
 の#define MIN(A、B)<B:B
 使用して 名前空間STDを、
typedefの長い 長いLL。
const  int型 INF = 0x3f3f3f3f const  int型 MAXN = 1E6 + 10 constの ダブル ESP = 1E- 9 int型、M、N、S、X、Y、Z、A、B、C。
INT OB [ 51 ] [ 51 ] [ 51 ]。
構造体LO 
{ 
    int型X、Y、Z、CNT。
    LO(int型int型 B、int型 C、int型CNT):X(A)、Y(B)、Z(C)、CNT(CNT){} 
}。
int型の FX [ 6 ] [ 3 ] = {{ 100 }、{ 010 }、{ 001 }、{ - 100 }、{ 0、 - 10 }、{ 00、 - 1 }}。
INT のmain()
{ 
    int型 T。
    CINI(T)。
    一方、(T-- 
    { 
        CINI(A)。
        CINI(B)。
        CINI(C)。
        CINI(S); 
        int型 iは= 0 ; iが<I ++ のためのINT J = 0 ; J <B; J ++ のためのINT K = 0 ; K <Cあり、k ++ 
                    CINI(OB [I] [J] [K ]); 
        // 一方(CIN >> X >> Y >> Z)COUT << OB [X] [Y] [Z] << ENDL。
        キュー<LO> Q;
        しばらく(!q.empty())q.pop(); 
        (LO(q.push0000 )); 
        OB [ 0 ] [ 0 ] [ 0 ] = 1 一方、(!q.empty())
        { 
            LO TEM = q.front()。
            int型、A = tem.x。
            int型、B = tem.y。
            int型、C = tem.z。
            int型 CNT = tem.cnt。
            もし(A- == 1 && Bの== B- 1 && C == C- 1 
            { 
                (のprintf" %Dを\ n " 、CNT)。
                後藤ループ。
            } 
            q.pop()。
            以下のためにint型 i = 0 ; iは< 6 ; iは++ 
            { 
                場合(A + FX [I] [ 0 ] < 0 || + FXの[I] [ 0 ]> = A || B + FX [I] [ 1 ] < 0 || B + FX [I] [ 1 ]> = B || C + FX [I] [ 2 ]> = C || C + FX [I] [ 2 ] < 0続けますもし(OB [A + FX [I] [ 0 ] [B + FX [I] [ 1 ] [C + FX [I] [2 ]] == 0 && CNT + 1 <= S)
                { 
                  // COUT << + FXの[I] [0] << '<< B + FX [I] [1] <<'' << C + FX [I] [2] << ENDL。
                    OB [A + FX [I] [ 0 ] [B + FX [I] [ 1 ] [C + FX [I] [ 2 ] = 1 ; 
                    q.push(LO(A + FX [I] [ 0 ]、B + FX [I] [ 1 ]、C + FX [I] [ 2 ]、CNT + 1 ))。
                } 
            } 
        } 
       のprintf(" -1の\ n " ); 
       ループ:
    } 

}

 

おすすめ

転載: www.cnblogs.com/lunatic-talent/p/11329046.html