wvogel日記

自分用の技術備忘録が多めです.

POJ No.2386

蟻本P.35に掲載されていた問題。
要は、二次元配列で渡されたマップ情報を読んで、近傍8座標で繋がっている領域数の数え上げ。

ソースコードこちら

(x,y) -> (0,0),(0,1)..
のように、順に横方向に探索をかけ、領域が存在したら、
その近傍4点に関して再帰的に関数に適用して終端まで処理を行う。
訪問済み座標群をここではIORefで管理しているけれど、タプルとか使えば、わざわざ変数扱いにする必要もなかった。

Haskellでこのような二次元配列問題を扱う場合、
何度も書いたけれど、書き換えのコストがサイズによって非常に大きくなるので、
Data.Vectorを使うとかIORefを使うとか、色々やりようがあると思うのだけれど、
今回の場合は二次元配列自体の書き換えをせずに済んでいるので、流れは簡潔にできた、気がする。

訪問済み座標も、
領域内の座標に限り更新しているので、リストサイズは抑えられている。
と思うのだけれど.....

試験からも開放され、久々にHaskellを触ったのでしたー