ABC472 D - Bomber Mad

爆破狂

考え方

やや特殊な迷路問題。
とはいえやることは単純で、以下を順に実行すればよい。

安全マスを求めるのに、毎回縦横のマスをチェックすると $O(HW(H+W))$ かかってしまう。
$1$ つめと $2$ つめを別作業にして計算量を $O(HW)$ にするのがポイント。
そこさえ気づければ、あとは実装力勝負。

全体の計算量は $O(HW)$ である。

入力例3での動作

入力を受け取る。

h: 5
w: 7
k: 2
s:
"..#...."
"..#...."
"......."
"...#..."
"...#..."

爆弾が存在しない行は $3$ 行目だけである。
爆弾が存在しない列は $1,2,5,6,7$ 列目である。
したがって、安全マスは $(3,1),(3,2),(3,5),(3,6),(3,7)$ の $5$ マスとなる。

この $5$ マスを全て距離 $0$ として多始点幅優先探索を行う。
各マスから最寄りの安全マスまでの距離は次のようになる。# は爆弾マスである。

$1$ 列 $2$ 列 $3$ 列 $4$ 列 $5$ 列 $6$ 列 $7$ 列
$1$ 行 $2$ $2$ # $3$ $2$ $2$ $2$
$2$ 行 $1$ $1$ # $2$ $1$ $1$ $1$
$3$ 行 $0$ $0$ $1$ $1$ $0$ $0$ $0$
$4$ 行 $1$ $1$ $2$ # $1$ $1$ $1$
$5$ 行 $2$ $2$ $3$ # $2$ $2$ $2$

空マスは全部で $31$ マスあり、このうち距離が $2$ 以下なのは $(1,4)$ と $(5,3)$ 以外の全てである。
したがって、条件を満たすマスは $29$ マスである。

注意点

特になし。

別解

特になし。