AcWing 177 噩夢 雙向BFS

2021-10-24 12:41:53 字數 1648 閱讀 7003

給定一張n*m的地圖,地圖中有1個男孩,1個女孩和2個鬼。

字元「.」表示道路,字元「x」表示牆,字元「m」表示男孩的位置,字元「g」表示女孩的位置,字元「z」表示鬼的位置。

男孩每秒可以移動3個單位距離,女孩每秒可以移動1個單位距離,男孩和女孩只能朝上下左右四個方向移動。

每個鬼佔據的區域每秒可以向四周擴張2個單位距離,並且無視牆的阻擋,也就是在第k秒後所有與鬼的曼哈頓距離不超過2k的位置都會被鬼占領。

注意: 每一秒鬼會先擴充套件,擴充套件完畢後男孩和女孩才可以移動

求在不進入鬼的占領區的前提下,男孩和女孩能否會合,若能會合,求出最短會合時間。

輸入格式

第一行包含整數t,表示共有t組測試用例。

每組測試用例第一行包含兩個整數n和m,表示地圖的尺寸。

接下來n行每行m個字元,用來描繪整張地圖的狀況。(注意:地圖中一定有且僅有1個男孩,1個女孩和2個鬼)

輸出格式

每個測試用例輸出乙個整數s,表示最短會合時間。

如果無法會合則輸出-1。

每個結果佔一行。

資料範圍

1這是一種bfs新的擴充套件方式,先把男孩每一步能擴充套件的區域標記為1,同時女孩每一步能擴充套件的區域標記為2,男孩與女孩能相遇的條件就是走過相同的區域。因為要維護每一步所有的區域。因此採用下面的方式

#include

#include

#include

#include

using

namespace std;

typedef pair<

int,

int> pii;

const

int n =

810;

char g[n]

[n];

int n, m;

int st[n]

[n];

pii ghost[2]

;bool

check

(int x,

int y,

int step)

intbfs()

, dy[4]

=;pii boy, girl;

int cnt =0;

for(

int i =

0; i < n; i++);

else

if(g[i]

[j]==

'g') girl =

;else

if(g[i]

[j]==

'z') ghost[cnt++]=

;}}

queue qb, qg;

qb.push

(boy)

; qg.

push

(girl)

;int step =0;

while

(qb.

size()

|| qg.

size()

));}

}}}}

for(

int i =

0; i <

1; i++))

;}}}

}}}return-1

;}intmain()

return0;

}

題解 AcWing177 噩夢

題面 考慮雙向廣搜。我們需要記錄男孩和女孩的當前位置,並且每次都進行擴充套件。記錄乙個陣列 st i j 如果當前擴充套件的是男孩,且當前的位置是 x,y 那麼當 st x y 2 時直接返回當前擴充套件的層數即可 如果當前擴充套件的是女孩,那麼當 st x y 1 時直接返回就可以了。題目中有一句...

177 單詞替換

題目描述 你需要輸出替換之後的句子。示例 1 輸入 dict 詞典 cat bat rat sentence 句子 the cattle was rattled by the battery 輸出 the cat was rat by the bat 注 輸入只包含小寫字母。1 字典單詞數 1000...

careercup 中等難度 17 7

17.7 給定乙個整數,列印該整數的英文描述 例如 one thousand,two hundred thirty four 解法 舉個例子,在轉換19 323 984時,我們可以考慮分段處理,沒三位轉換一次,並在適當的地方插入 thousand 千 和 million 百萬 也即,convert ...