計蒜客 T 1213 拯救行動 bfs 優先佇列)

2021-10-10 00:27:01 字數 1546 閱讀 2008

拯救行動

題目描述:

現假設騎士可以向上、下、左、右四個方向移動,每移動乙個位置需要 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 的網格,其中有道路有...