2001年度後期に、東京大学電気電子情報系3年進学予定者対象とした伊庭助教授担当「コンピュータプログラミング」の講義があったらしく、それに某知人が参加している。そして、最終レポートがニコリのペンパである黒マスはどこだを解けというものであった。それに関して質問が来たりしたので、ちょうど春休みに入ったこともあり暇だったため開発をし、めでたく解けるプログラムが出来上がった。
そこでソースプログラムなどは提出締切までは非公開だったが、無事提出期限は過ぎたので公開したい。
なお、課題を出しているページは年度が変わったときに消滅しているのでミラーを作っておいた。
解く順番はこのようになっている。
そんなことより大事なのは、「黒マスだったらハタンする」を検索するための、黒マス分断禁ルールの実装である。その判定をいかに行うかを示す。黒マス配置用メソッドにおいて、黒マスを配置した場合はそのタテヨコ4方は白マスに確定させている。
あとはソースを見てくれれば、どこで何をしているかはコメントが多いので分かると思うが、分かりやすいよう図を示しつつ解説する。今から*印のところに黒マスを配置しようとするときのチェック内容である。
ちなみに、後で気づいたのだが、外壁に接している群番号は正であれば別に同じでも構わなかったので、1に統一すれば簡略化できるようだ。「周りに2つ以上外壁と接する〜」を「周りに同じ番号が複数あったら〜」に含ませることができる。
|
まわりにひとつも黒マスがない場合。 外壁に接していれば正の壁番号をつける。 接していなければ負の壁番号をつける。 |
||||||||||||||||||||||||||||||||||||
|
黒マスを配置しようとする点が最外壁で、周りに正の壁番号があるときは分断 | ||||||||||||||||||||||||||||||||||||
|
周りに2つ以上外壁と接する壁番号がある場合は分断。 | ||||||||||||||||||||||||||||||||||||
|
周りに同じ番号が複数あったら分断 | ||||||||||||||||||||||||||||||||||||
|
周りにひとつしか壁番号がないときはその番号をコピーする。要するに群が広がる | ||||||||||||||||||||||||||||||||||||
|
周りに複数の壁番号があった場合。 どれかが正ならば全ての壁番号が正の新しい壁番号に変更 全て負ならば全ての壁番号が負の新しい壁番号に変更 要するに群が一体化 |
このチェックによって黒マス分断は全て判定できると思われる。私には証明なぞできません。
黒マス分断判定はほかの人のプログラムではどうやって実装されているのか気になってしょうがないのであった。