邪悪な王女は彼のセル内のどこかに投獄され、奪われました。N * Mで表されるセル(N、M < = 200) マトリックス。各マトリックスは、道路(@)、壁(#)、およびガード(X)を表すことができます。
ヒロイック騎士(R)は、単独王女(A)を保存することを決めました。我々は成功した表現を保存することであることを前提とし、「ナイトプリンセスの場所に到着しました。」ガードプリンセス、警備員のナイトイベントは、警備員が前進し続けるために殺さなければならない場所に通じる道路で遭遇することができるよう。
それぞれが位置を移動すると、警備員の1時間の追加的な1つの単位を費やす必要を殺し、時間の1単位を必要とし、騎士団は、上に移動下に移動、左右できるものとします。また、十分に強い騎士は、すべての警備員を殺す能力を持っていることを前提としています。
マトリクス位置における細胞マトリックス、王女、騎士や警備員を考えると、あなたは救助活動の成功を計算する最短時間を要します。
入力は、入力データ(入力の複数のセット)で表される第一整数Sの挙動のセットの数
データのSグループに続くは、次の形式で各入力データ
1は、2つのNは整数を表し、M(N、M <= 200 )。
2、N行、M個のシンボルを有する各列が続きます。道路については「@」は、「」姫を表し、「R」は、騎士を表し、「x」はガードを表し、「#」は、壁を表します。出力成功した場合救助活動、出力アクションのための最小時間を表す整数。
これが成功しない場合には、出力「インポッシブル」のサンプル入力
2 7 8 ##### @# #@ A#@@ R @ #@@#X @@@ @@#@@#@# #@@@ ## @@ @#@@@@@@ @@@@@@@@ 13 40 @x @@ ## X @#X @ X#XXXX ## @#X @ X @@#Xの#@#1 X#@@ X @#@ X XX ### X @x#@@ ## xxは、@@@#@ @@#1のx @ xxxの@@#@#のX X X @@ X @ #@#@のX#1のx#X @@ ## @@ X#1 @ xxの番号xxxの@@ X ## @@@#@ X @@ X @ X @ ##のx @@@ X#XX#@@#XXXX#@@ X @ X @#@ X @@@ X @#@#は、x @# @ #xxxxx ## @@ X ## X XXX @@#X @ X #### @@@ X#X ## @#@ @ #XXX#@#X ## XXXX @@#xxは、@@@ X @ xxxの#@ #xxxにする@ X #####の #@ X X XXXX#@ X @@@@ ## @ X#XX#XXX @#XX#@ ##### @#のX XX ## @#@ X ## X ## @ ## @#@ ## XX @#@@ X @ X XX#@ @ X#X# #xxxxの@ ##のx ## XX#する@#のX X X#のX#1 @ Xする@#のX#@ ## @ XRX @ @ XX @ #X @@#@ ###のx ##のx @ X#@@#@@ X @ X @@ XX @@@@ ## @@ X @@ X X#XX @ X ### @ xxxの# @ @#@@#@@ X#@ X#1のx#@@ ### @#@ ## @を #@#X @ X#X#1のx ### @ X @@ XXX #### X @ X ## @ X #### XX#1 @のX #X#1 @のx#X ###### @@#X @#XXXX#xxは、@@@#XX#X ##### @
サンプル出力
13 7
書式#include <iostreamの> の#include <CStringの> の#include <cstdioを> する#include <アルゴリズム> 書式#include <キュー> 使用して 名前空間はstd; INT DX [ 4 ] = { 0、0、1、 - 1 }、DY [ 4 ] = { 1、 - 1、0、0 }。 int型 [ 202 ] [ 202 ]、B [ 202 ] [ 202 ]。 構造体ノード { int型X、Y、T。 }。 INT のmain() { int型のT。 cinを >> トン。 キュー <ノード> Q; ノード今、次。 一方、(t-- ) { memsetの( - 1、はsizeof (a)参照)。 INTのXQ、YQ、N、XZ、YZ、M。 CIN >> N >> M。 char型のC; 以下のために(int型 i = 1 ; iは++; iが= N < ) のための(INT J = 1 ; J <= Mであり、j ++ ) { CINを>> C; もし(C == ' @ ' ) [I] [J] = 1 。 もし(C == ' X ' ) [I] [J] = 2 ; もし(C == ' R ' ) now.x = I、now.y = J。 もし(C == ' A ' ) のxz = I、YZ = J; B [i]は[J] = 4002149 。 } now.t= 0 ; 長い 長い ANS = 49021042112 ; q.push(今)。 しばらく(!q.empty()) { 今 = q.front(); q.pop(); 以下のために(int型 i = 0 ; iは< 4 ; I ++ ) { 長い 長い XB = now.x + DX [i]は、YB = now.y + DY [i]は、BT = now.t。 もし(XB == XZ && YB == YZ) { ANS =分(ANS、BT)。破ります; } もし([XB] [YB] = - !1 && BT + [XB] [YB < B [XB] [YB]) { next.t = BT + [XB] [YB]。 next.x = XB、next.y = YB。 B [XB] [YB] = next.t。 q.push(次) } } } もし(!ANS = 49021042112 ) COUT << ANS + 1 << ENDL。 他の 裁判所未満 << 「インポッシブル」 <<endl; } }