MENU

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

ペントミノパズルの3D版ソルバーです。2D版を作ったあと3D版は簡単に作れると思っていましたが、鏡映の判断に時間がかかってしまいました。
パズルのルールは単純です。ペントミノ2Dの各ピースを立体にしたものを直方体に箱詰めするものです。直方体の体積は60です(5x4x3, 6x5x2, 10x3x2の3種類)。現在(2022年)市販のものもいくつか販売されていますが、ハナヤマという会社から「かつのう」という名前で販売されているものが手に入りやすいようです。


解は1通りではありません。5x4x3の直方体の場合解は 3940通りもあります。しかしながら実際のパズルを手作業で完成させようとすると、その中の1つの解をみつけることもかなり難しいです。そこでプログラムを使ってソルバーを作ろうと思い立ったわけです。正解を論理的に導き出すアルゴリズムはないとのことなので2Dのように力任せで解を求めることにしました。

プログラムの概要


直方体のサイズを選択して[探索開始]をクリックすると解の探索を開始します。解が見つかったら各段の断面を表示します。[都度確認あり]をチェックすると解の表示ごとに一旦停止します。さらにプログラムの進行状態を示すためプログレスバーと途中放棄用のキャンセルボタンをつけています。

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

1.座標クラス:Coord  3次元の点を表すクラスです。水平をX軸(右が増加)、奥行きをY軸(手前が増加)、垂直をZ軸(上が増加)とする一般的なものです。

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

3.棚クラス:Shelf
 部品棚です。棚は全部で12個作り、1つの棚に1種類の部品を登録します。登録する部品は回転や裏返しをしたものをあらかじめ用意しておきます。例えば部品Tの棚には向きの違う12種類の部品Tが登録されます。

4.箱クラス:Box
 部品を詰め込む箱です。内部は処理速度を速くするために1次元の配列で表現しますが、外からは3次元のように使用します。部品が置いてあれば True 、空いていれば False で表現します。

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

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