POJ No.2386
蟻本P.35に掲載されていた問題。
要は、二次元配列で渡されたマップ情報を読んで、近傍8座標で繋がっている領域数の数え上げ。
(x,y) -> (0,0),(0,1)..
のように、順に横方向に探索をかけ、領域が存在したら、
その近傍4点に関して再帰的に関数に適用して終端まで処理を行う。
訪問済み座標群をここではIORefで管理しているけれど、タプルとか使えば、わざわざ変数扱いにする必要もなかった。
Haskellでこのような二次元配列問題を扱う場合、
何度も書いたけれど、書き換えのコストがサイズによって非常に大きくなるので、
Data.Vectorを使うとかIORefを使うとか、色々やりようがあると思うのだけれど、
今回の場合は二次元配列自体の書き換えをせずに済んでいるので、流れは簡潔にできた、気がする。
訪問済み座標も、
領域内の座標に限り更新しているので、リストサイズは抑えられている。
と思うのだけれど.....
試験からも開放され、久々にHaskellを触ったのでしたー