MENU

【VB】ペントミノ2Dパズルを解く(9)終わりに

この連載をお読みいただきありがとうございました。
最後にこのプログラムのメーキングをどうぞ。

・名前は大切

"Shelf" は最初 "Bag" としていました。以後 "Bag" → "Tray" → "Pocket" → "Shelf" と4度も名前を変えて最終的に「棚」で落ち着きました。部品の向きを固定して並べる意味で最終的に "Shelf" に決定しました。他にも "Piece" と "Parts" で悩んだり座標クラスの名前で迷うなど、筆者の「決められない」癖は現役のときから自覚をしていましたがなかなか直りそうもありません。 プログラムを作るときには、具体的なイメージがしやすいクラス名が欠かせません。クラスや変数の名前が抽象的だと理解に時間がかかり、成果物の品質に良い影響は与えません。

・プロパティか、関数か

ReadOnly のプロパティを作るとき「関数にすべきではないのか」とずいぶん悩みました。結論としては引数の有無になるのかなと思います。引数がないプロパティは括弧をつけなくてもいいのでコードがきれいに見えます。引数があるものは関数で記述します。

・0オリジンか、1オリジンか

ボードの左上の座標を (0, 0) とした方がいいのか (1, 1) とした方がいいのか、これは「0オリジン」が正しいに決まっています。VBA を使っているとエクセルの Cells は「1オリジン」だからという理由で (1, 1) を左上の座標にしてしまいそうですが、これは誤り。VBA で書くコードも 「Option Base 0」を先頭に記述して「0オリジン」を徹底すべきです。VB.Net では議論の余地はありません。

プログレスバーには苦労した

今回のプログラムでかなり時間を割いたのは、実はプログレスバーの表示でした。全体の件数をウィキペディアで公開されている正解数でリテラル打ちして、正解表示のたびにバーの値を1ずつ加算しようかとも考えましたが、ちょっとずるい感じがしました。
そんなときに思いついた「ボードの左上隅に置いた部品の部品棚での順番」は苦肉の策です。バーがガクガクと表示されるのではないかと心配しましたが、それほど違和感はないようでうまくいったと思います。

・結果表示

結果を表示するまでの時間は「10X6」が1分半前後で、他はそれより少なくなります。ボードのサイズは横長ですが空白を探索する方向は短辺(縦)方向です。プログラムを変更して 10X6→6X10 のように縦長にすると、アルゴリズムの関係でおそろしく時間が掛かるようになります。組み合わせの回数が長辺(横)探索の方が圧倒的に多くなるためです。

・3次元への展開

今回のプログラムは2次元のペントミノでしたが、正方形を立方体にした3次元のペントミノの箱詰めパズルに挑戦したいと思っています。今回のプログラムを少し変更すれば比較的簡単にできるのではないかと思っています。

ご期待ください。