4116:拯救行動
總時間限制: 1000ms 記憶體限制: 65536kb
描述
公主被惡人抓走,被關押在牢房的某個地方。牢房用n*m (n, m <= 200)的矩陣來表示。矩陣中的每項可以代表道路(@)、牆壁(#)、和守衛(x)。
英勇的騎士(r)決定孤身一人去拯救公主(a)。我們假設拯救成功的表示是「騎士到達了公主所在的位置」。由於在通往公主所在位置的道路中可能遇到守衛,騎士一旦遇到守衛,必須殺死守衛才能繼續前進。
現假設騎士可以向上、下、左、右四個方向移動,每移動乙個位置需要1個單位時間,殺死乙個守衛需要花費額外的1個單位時間。同時假設騎士足夠強壯,有能力殺死所有的守衛。
給定牢房矩陣,公主、騎士和守衛在矩陣中的位置,請你計算拯救行動成功需要花費最短時間。
輸入
第一行為乙個整數s,表示輸入的資料的組數(多組輸入)
隨後有s組資料,每組資料按如下格式輸入
1、兩個整數代表n和m, (n, m <= 200).
2、隨後n行,每行有m個字元。"@"代表道路,"a"代表公主,"r"代表騎士,"x"代表守衛, "#「代表牆壁。
輸出
如果拯救行動成功,輸出乙個整數,表示行動的最短時間。
如果不可能成功,輸出"impossible」
樣例輸入
27 8
#@#####@
#@a#@@r@
#@@#x@@@
@@#@@#@#
#@@@##@@
@#@@@@@@
@@@@@@@@
13 40
@x@@##x@#x@x#***x##@#x@x@@#x#@#x#@@x@#@x
xx###x@x#@@##xx@@@#@x@@#x@***@@#x@#x@@x@
#@x#@x#x#@@##@@x#@xx#***@@x##@@@#@x@@x@x
@##x@@@x#xx#@@#***x#@@x@x@#@x@@@x@#@#x@#
@#***xx##@@x##x@***@@#x@x####@@@x#x##@#@
#***#@#x##***x@@#xx@@@x@***#@#***@x#####
#x@***x#@x@@@@##@x#xx#***@#xx#@#####x#@x
xx##@#@x##x##x#@x#@a#xx@##@#@##xx@#@@x@x
x#x#@x@#x#@##@xrx@x#***x@##x##xx#@#x@xx@
#x@@#@###x##x@x#@@#@@x@x@@xx@@@@##@@x@@x
x#xx@x###@***#@#x#@@###@#@##@x#@x@#@@#@@
#@#x@x#x#x###@x@@***####x@x##@x####xx#@x
#x#@x#x######@@#x@#***x#xx@@@#xx#x#####@
樣例輸出137
問題簡述:(略)
問題分析:使用優先搜尋來解決,用優先佇列來實現,其他都是套路。走一格,如果沒有守衛則只需要1個單位時間,如果有守衛則需要2個單位時間。因為是求最優解的問題,需要用優先搜尋,即先試著從那些到目前為止時間花費最少的情況往下走,才有可能找到最優解。
程式說明:(略)
參考鏈結:(略)
題記:(略)
ac的c++語言程式如下:
/* bailian4116 拯救行動 */
#include
using
namespace std;
const
int n =
200;
char b[n]
[n +1]
;bool vis[n]
[n];
struct node
friend
bool
operator
<
(node a, node b)};
int dr=
;int dc=
;const
int dl =
sizeof
(dr)
/sizeof
(int);
intmain()
else
if(b[i]
[j]==
'a')
while
(!q.
empty()
)}if(q.
empty()
)puts
("impossible");
else
printf
("%d\n"
, q.
top(
).time);}
return0;
}
百練 4116 拯救行動
總時間限制 1000ms 記憶體限制 65536kb 描述公主被惡人抓走,被關押在牢房的某個地方。牢房用n m n,m 200 的矩陣來表示。矩陣中的每項可以代表道路 牆壁 和守衛 x 英勇的騎士 r 決定孤身一人去拯救公主 a 我們假設拯救成功的表示是 騎士到達了公主所在的位置 由於在通往公主所在...
OpenJudge 4116 拯救行動
題目鏈結 首先找到騎士的位置,然後把騎士的位置插進佇列,從這個位置向上下左右找,如果是守衛,把守衛變成 一條可走的路,然後位置不變,時間 1,把這個點放進佇列。直到找到公主跳出。include include include include using namespace std const int...
OpenJ Bailian 4116 拯救公主
公主被惡人抓走,被關押在牢房的某個地方。牢房用n m n,m 200 的矩陣來表示。矩陣中的每項可以代表道路 牆壁 和守衛 x 英勇的騎士 r 決定孤身一人去拯救公主 a 我們假設拯救成功的表示是 騎士到達了公主所在的位置 由於在通往公主所在位置的道路中可能遇到守衛,騎士一旦遇到守衛,必須殺死守衛才...