from 第四回 アルゴリズム実技検定 PAST4G G - 村整備
- 考えたこと
- 高々100マス
- 連結成分が1個なら全ての壁
- 2個ならそれをつなぐ壁
- 3個以上ならそれをつなぐ壁
- 4個でもそう
- 5個以上なら0
- ライブラリの改善メモ
- 読んだものをどうエンコードするか指定できるといいな
- 用意してたライブラリでは壁が0、道が1になるが、今回は色番号で塗りたいので大きめの数にした
- 4方位、8方位、なども定数にしておく
- C問題でも使ったので。
- 補足
- 隅からDFSで塗っていく
- まだ塗られていないマスが見つかったら色数をインクリメント
- 色数が5以上なら0
- 各マスについて四方の色を確認、すべての色が出現しているマスを数える python
def solve(H, W, data):
DOT = 100
BLOCK = 101
def paint(pos, color):
data[pos] = color
for d in [-WIDTH, -1, +1, +WIDTH]:
if data[pos + d] == DOT:
paint(pos + d, color)
color = 0
for pos in allPosition():
if data[pos] == DOT:
paint(pos, color)
color += 1
if color >= 5:
return 0
ret = 0
for pos in allPosition():
if data[pos] != BLOCK:
continue
color_exists = [0] * 4
for d in [-WIDTH, -1, +1, +WIDTH]:
c = data[pos + d]
if c < 4:
color_exists[c] = 1
if sum(color_exists) == color:
ret += 1
return ret
- 公式解説
- マップが10×10とかなり小さい
- なので、各壁を始点として「その壁を壊したらすべての壁でないマスが到達可能になるか?」を探索しても10^4程度で余裕
- O(N^4)
- 僕の解法はO(N^2)なのでオーバーキルであった