給定一張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 ...