拯救行動
題目描述:
現假設騎士可以向上、下、左、右四個方向移動,每移動乙個位置需要 1 個單位時間,殺死乙個守衛需要花費額外的 1 個單位時間。同時假設騎士足夠強壯,有能力殺死所有的守衛。
給定牢房矩陣,公主、騎士和守衛在矩陣中的位置,請你計算拯救行動成功需要花費最短時間。
輸入格式
1、兩個整數代表 n 和 m, (n,m≤200).
2、隨後 n 行,每行有 m 個字元。"@" 代表道路,「a」 代表公主,「r」 代表騎士,「x」 代表守衛, 「#」 代表牆壁。
輸出格式
如果拯救行動成功,輸出乙個整數,表示行動的最短時間。
如果不可能成功,輸出 「impossible」。
輸出時每行末尾的多餘空格,不影響答案正確性
樣例輸入
7 8#@#####@
#@a#@@r@
#@@#x@@@
@@#@@#@#
#@@@##@@
@#@@@@@@
@@@@@@@@
樣例輸出
13解題思路:
此題在走到x和@時的花費是不同的,但bfs是按順序進行搜尋的,因此可能搜尋到結果時的時間不是最短,此時就需要用到優先佇列,時間短的先出隊**:
#include
#include
using
namespace std;
int n,m,f,sx,sy,ex,ey;
char map[
205]
[205];
int flag[
205]
[205];
int tr[4]
[2]=
,,,}
;struct node
friend
bool
operator
<
(node a,node b)};
intmain()
if(map[i]
[j]==
'a')}}
priority_queue q;
node temp
(sx,sy,0)
; q.
push
(temp)
; flag[sx]
[sy]=1
;while
(!q.
empty()
)if(!flag[tx]
[ty]
&&map[tx]
[ty]
=='@')if
(!flag[tx]
[ty]
&&map[tx]
[ty]
=='x')}
}if(f==1)
break;}
if(f==
0) cout<<
"impossible"
}
計蒜客題解 T1213 拯救行動
計蒜客 oj,公主被惡人抓走,被關押在牢房的某個地方。牢房用 n m n,m 200 的矩陣來表示。矩陣中的每項可以代表道路 牆壁 和守衛 x 英勇的騎士 r 決定孤身一人去拯救公主 a 我們假設拯救成功的表示是 騎士到達了公主所在的位置 由於在通往公主所在位置的道路中可能遇到守衛,騎士一旦遇到守衛...
計蒜客 1769 合租bfs
蒜頭君來到一座陌生的城市打工,他和幾個朋友合租乙個房子。房東給他們發來了戶型圖,這個房子非常大,而且布局很奇怪。具體來說,房子可以被看做乙個 n times mn m 的矩形,有牆壁的地方被標記為 其他地方被標記為 通過 連在一起的區域被稱作房間,現在蒜頭君想知道,一共有多少個房間。輸入格式 第一行...
計蒜客 蒜頭君回家(bfs)
蒜頭君要回家,但是他家的鑰匙在他的朋友花椰妹手裡,他要先從花椰妹手裡取得鑰匙才能回到家。花椰妹告訴他 你家的鑰匙被我複製了很多個,分別放在不同的地方。蒜頭君希望能盡快回到家中,他需要首先取得任意一把鑰匙,請你幫他計算出回家所需要的最短路程。蒜頭君生活的城市可以看做是乙個 n m 的網格,其中有道路有...