パズル勉強会

パズルプログラミング勉強会

第1課題 関連

3Dペントミノ(5×4×3)

見てはいけないソース:facom.c
見てはいけない全解:facom_ans.lzh(216K) or facom_ans.txt(2.6M)
by パソコン初心者


ここで紹介したペントミノは2次元の10×6のサイズ のものであったが、おなじピース形状で、3次元に組み上げることが考えられる。

正方形を立方体にし、小さな立方体が、同一平面上で5つ繋がった12種のピースを、 5×4×3の直方体に詰め込むことが考えられる。実際、株式会社テンヨーから、 このパズルは商品として売られていた。名称は、FACOMである。名前から明らかに F社が思い浮かぶであろうが、F社の協力で全解が求められていたらしい。

さて、3次元になったら2次元の時と比較して大変かというと、そんなことはまったくない。 そもそも、2次元版が、実際のデータは1次元として持っていて、1次元⇔2次元 の変換が 用意されていたので、今度は1次元⇔3次元の変換を用意すれば良いだけに過ぎない。

そういうことで、プログラムはペントミノをちょっと改造しただけで、 特別の最適化とか何もやっていない。原稿〆切の間に、ちょっと気晴らしで変更した程度の 手抜きであるのは我慢して欲しい。まあ、そんな感じで出来るのは、次元が増えてもほとんど 障害にならないことの証明であろう。実際、解説などを書いている時間の方が長い。

プログラムを実際に動かすと、 Kondara(Linux)で、CPUはCeleronの700MHzで、 -O2 でコンパイルしたとき、3940通り解き終えるのに 約18分かかった。 何の最適化もしていないのだから、まあまあかな。 それより、プログラムの改造に2時間かかっていないところの方が重要かな。

コンパイルして動かすと、

$facom
Total Count : 3940
Tryal Count : 1108709132

$facom -p
No. 1
F Y Y Y Y   I I I I I   W L L L L   
F F F Y Z   N N Z Z Z   W W Z T L   
U F V V V   U N N N V   U W W T V   
U X P P P   X X X P P   U X T T T   

No. 2
F V V V N   I I I I I   W Z Z U U   
F F F V N   W P P P N   W Z P P U   
W F X V L   W X X X N   Z Z X U U   
T L L L L   T T T Y N   T Y Y Y Y   


$faom -l
No. 1
+---+---+---+---+---+   +---+---+---+---+---+   +---+---+---+---+---+   
|   |               |   |                   |   |   |               |   
+   +---+---+   +---+   +---+---+---+---+---+   +   +---+---+---+   +   
|           |   |   |   |       |           |   |       |   |   |   |   
+---+   +---+---+---+   +---+   +---+---+---+   +---+   +---+   +---+   
|   |   |           |   |   |           |   |   |   |       |   |   |   
+   +---+---+---+---+   +---+---+---+---+---+   +   +---+---+   +---+   
|   |   |           |   |           |       |   |   |   |           |   
+---+---+---+---+---+   +---+---+---+---+---+   +---+---+---+---+---+   

$facom -p -l
No. 1
+---+---+---+---+---+   +---+---+---+---+---+   +---+---+---+---+---+   
| F | Y   Y   Y   Y |   | I   I   I   I   I |   | W | L   L   L   L |   
+   +---+---+   +---+   +---+---+---+---+---+   +   +---+---+---+   +   
| F   F   F | Y | Z |   | N   N | Z   Z   Z |   | W   W | Z | T | L |   
+---+   +---+---+---+   +---+   +---+---+---+   +---+   +---+   +---+   
| U | F | V   V   V |   | U | N   N   N | V |   | U | W   W | T | V |   
+   +---+---+---+---+   +---+---+---+---+---+   +   +---+---+   +---+   
| U | X | P   P   P |   | X   X   X | P   P |   | U | X | T   T   T |   
+---+---+---+---+---+   +---+---+---+---+---+   +---+---+---+---+---+   

$facom -s
F . . . .   . . . . .   . . . . .   
F F F . .   . . . . .   . . . . .   
. F . . .   . . . . .   . . . . .   
. . . . .   . . . . .   . . . . .   

F . . . .   I I I I I   . . . . .   
F F F . .   . . . . .   . . . . .   
. F . . .   . . . . .   . . . . .   
. . . . .   . . . . .   . . . . .   

F . . . .   I I I I I   W . . . .   
F F F . .   . . . . .   W W . . .   
. F . . .   . . . . .   . W W . .   
. . . . .   . . . . .   . . . . .   

というふうに動いたりする。以上がきれいに表示されているかどうかは、 ブラウザによるので、ダメな場合はブラウザを調整しよう。 また、実際に動かした場合も、きれいに表示されるかどうかは、使用しているターミナルに依存する。

実際に動かすと、総数が3940通り、ああでもない、こうでもないとコンピュータが試行する回数は 1108709132回にも及んでいる。直線状の「I」形の辺は置き方が限られるので、それをプログラムで チェックする前は、試行回数が負数になってしまった。要するに32ビット符号付で表現できなかったのである。 この試行回数は、既にダメなのが簡単に人間なら分かっている場合でも、 ただただ、左側から、上から下に順に調べるという阿呆なアルゴリズムなので、ダメなのである。

5×4×3の直方体も、結局小立方体が60個なので、64ビット整数で表現している。 基本的なやり方は平面のペントミノの時と同じなので、全て省略する。 5×4×3の立体になった場合に違うところだけを以下で若干説明する。

ピース「F」の置き方を工夫すると、回転で同じになる答えは全部省くことができる。 しかし、これだけであると、鏡映したものは残ってしまうので、解の総数が2倍になってしまう。 さいごに残った鏡映は、実際にプログラムで解が求まる毎に鏡映パターンを生成し、一定規則で パターンの大小を比較し、元のパターンが小さい場合にだけ解としてカウントしている。

高速化のための種々の工夫はしなかったが、1点だけ簡単だったので加えた。 たった2行だったので、横着者でもなんとかなるレベルである。 それは、ピース「I」を置ける方向が、3軸のうち1つの方向しかない。 ピース「I」は、4×3の面に垂直にしか置けなくて、なおかつ「I」の中心軸方向には 動かせないことを利用している。つまり、ピース「I」は 4×3=12通りの置き方しかできないのである。

これ以上は面倒なので、解説は省略する。

さて、このプログラム、だれが勝手に改良してくれるのだろう。

2001年10月3日

パズル勉強会