はじめに
最近流行している数字パズルを半自動的に解くプログラムを紹介します。プログラムですべてを自動的に解くわけではないので、頭の体操にもなり、数字パズルに興味が湧いてきます。
- 完成版のアプレットを見る
対象読者
パズルの解法やゲームプログラムに興味のある人。
必要な環境
J2SE 5.0を使っていますが、これより古いバージョンでも、本稿のコードをコンパイルし、実行することができます。ただし、添付のコンパイル済みアプレットの実行には、J2SE Runtime Environment 5.0が必要です。
数字パズル
最近非常に流行していて、多くの雑誌や単行本が出版されているものに数字パズルがあります。標準的な数字パズルは、3×3のサブグリッド(サブマトリックス)をさらに3×3に並べたもので、サブグリッドには1~9の数字が重複することなく入り、全体のグリッド(9×9)を見ても、縦横に1~9の数字が重複することなく入ります。これだけの条件で空欄に適切な数字を当てはめて行くので、一見簡単のようですが、問題によっては非常に難しいものもあり、頭の体操や暇つぶしに好適です。
数字パズルを解くプログラム
ネット上には、有償無償の数字パズル解法プログラムが多数存在し、解答のみでなく問題作成のできるものもあります。多くは、バックトラッキング(Backtracking)法と呼ばれるアルゴリズムを使用し、論理的な推測によらず、失敗したら元に戻る試行錯誤を繰り返します。このアルゴリズムは再帰プログラムで記述することができ、プログラマにとっては比較的興味のある対象です。
半自動プログラムで数字パズルを解く
数字パズルの問題集を求め、鉛筆と消しゴムで必死に解くのも良いのですが、大部分の時間は、注目するマスに入力可能な数字を調べたり、特定の数字を入力できないマスを調べたりに費やしています。本稿で紹介するプログラムは、この作業を自動化して、最終的な判断は、コンピュータではなくユーザーに任せようというComputer Assisted Solving(コンピュータ支援解法)の考え方です。
ただし、入力できる数字が1個に限定される場合には、本稿のプログラムが自動的に数字を確定しますので、ある程度解答が進むと、瞬時的に自動的に全体を解答してしまう場合もあります。
バックトラッキング手法を味わってみたいユーザーのために「試行モード」を追加しました。やってみて失敗したら、元に戻せますので、別の選択肢で再度繰り返すことができます。ただし、このモードは安易に使わないでください。数字パズルを解く楽しみが失われてしまいます。上級の問題以外には、まず必要ないはずです。
プログラムの概要
ボタンなど画面上をクリックする度に呼び出されるpaint()
メソッドには、次の内容が記述されています。
- モードの種別を表示する
- 9×9のグリッドを描く
- グレイ領域(入力禁止領域)を設定する
- 入力可能な数字をマスの内部に表示する
- 入力可能な数字が1個のみの場合は、それを自動的に入力する
- 問題、解答、試行の既に入力された数字を表示する
9×9のグリッド内のマスをマウスでクリックした場合、次の動作をします。
- 出題モード
- 解答モード
- 試行モード