MENU

【VB】ペントミノ2Dパズルを解く(1)はじめに

ペントミノをご存じですか?正方形を5個つないだものをペントミノといい、正方形のつなぎ方の違いで全部で12種類あります。ウィキペディアによるとそれぞれのピースにはその形状をイメージしたアルファベット1文字の名前がついています。


これらのすべてを1個ずつ使って長方形のボードに敷き詰めるパズルが今回のテーマです。次の図は 10x6 のボードに敷き詰めた解のひとつです(解は1通りではありません。この 10x6 の長方形の場合は解は 2339 通り)。


このパズルは正解を論理的に導き出すことは不可能だそうです。子供であろうが数学者であろうが試行錯誤(トライアル&エラー)でしか解にたどり着けません。解法のプログラムはネットにも多くアップされています。私も触発されて VB.Net で作ってみることにしました。

プログラムの概要


フォームはシンプルにしました。ボードのサイズをラジオボタンで選択して[探索開始ボタン]をクリックすれば解の探索を開始します。解が見つかったらフォーム下側のリストビューに表示していきます。[都度確認あり]をチェックすると解の表示ごとに一旦停止します。さらにプログラムの進行状態を示すためプログレスバーと途中放棄用のキャンセルボタンをつけています。

作成するクラスは次のとおりです。

1.座標クラス:Coord  平面上の点を表すクラスです。水平をX軸(右が増加)、垂直をY軸(下が増加)とする一般的なものです。

2.部品クラス:Piece
 5つの正方形をつないだ部品(ペントミノ)を表すクラスです。実態は5つの座標のコレクションです。

3.棚クラス:Shelf
 部品倉庫です。1つの棚に1種類の部品を置くので棚は12作ります。回転や裏返しをしたものもあらかじめ用意しておき、取り出してボードに置くときいちいち回転や裏返しをしないで済むようにします。回転や裏返しで重なるものは除外するので、 L棚の部品は8個、 T棚は4個、 X棚は1個 、・・・ となります。


4.ボードクラス:Board
 部品を敷き詰める盤です。縦横のサイズに合わせた2次元の配列(boolean)です。部品が置いてあれば True 、空いていれば False で表現します。

以上がクラスの概要です。

次回はさっそく「座標クラス」を実装します。