座標圧縮
座標圧縮 というアルゴリズムを使うと、効率的に問題を解くことができるケースがあります。
[問題]
2次元のマップがあり、何もない通り抜けのできる空間(.)と通り抜けのできない壁(#)が設定されています。 壁によって分断されている領域は何個あるでしょうか。
解法・ソースコード
この問題では、前後の行または列に 変化がない場合 その行または列を省いても、壁によって分断される 領域の個数 は変わりません。
まず、同じ行があったらその行を削除し、次に同じ列があったらその列を削除するという処理を行います。
[Google Colaboratory]
1 | #---------- 入力例 ---------- |
[実行結果]
【 圧縮前 】 ...#....#. ...#....#. ...#....#. ######..#. ...#....#. ...#.....# ...#.....# ########## ...#.....# ...#.....# 【 圧縮後 】 .#..#. ###.#. .#..#. .#...# ###### .#...#
問題なく座標が圧縮され、壁に分断されている領域の数も変わっていないことが確認できました。
次に、圧縮されたマップに対して分断されている領域のカウントを行います。
これは、まず壁ではない地点をみつけ、そこからつながっている部分を 壁(#) に置き換えるという操作を繰り返します。
一回の深さ優先探索で、始めの壁ではない地点からつながっている空間(.)が全て壁(#)に変わるので、深さ優先探索を行った回数 が解となります。
[Google Colaboratory]
1 | # 深さ優先探索(Depth-First Search) |
[実行結果]
解: 6
解は 6 となり、壁により分断されている空間が6つであることが確認できました。








