プログラムの使い方
アプレットを実行すると、上方左に[取消]、[1]、[2]、……、[9]のラジオボタンが並んで表示されます。数字を入力するには、あらかじめこのボタンを選択しておき、グリッド内の希望するマスをクリックします。
その右には、[出題]、[解答]、[試行]のラジオボタンがあり、これでモードを切り替えます。さらに右には、[全クリヤ]、[解答クリヤ]、[試行クリヤ]のボタンが並んでおり、入力した数字のクリヤに使用します。各マスには小さな数字で、そこへ入力可能な数字が示されています。
アプレットを立ち上げた直後には、サンプル問題が出題されていて、「解答モード」になっています。ラジオボタンを[取消]から入力したい数字に変えて、このプログラムを試してみてください。
出題モード
新規に問題を入力するモードです。
まず、[全クリヤ]ボタンで問題を消去します。すると自動的に「出題モード」になりますので、問題集などを見ながら、例えば、ラジオボタン[1]を設定して「1」を入れるべきマスをクリックします。すると、黒色の書体で数字が入力されます。次に[2]を選択して「2」を入力します。入力の順番は任意です。
間違えて入力した場合には、正しく入力したい数字のラジオボタンを選択し、上書きすることができます。消去したい場合には、ラジオボタン[取消]を選択します。グレイ色の部分には入力できません。
解答モード
問題を間違いなく入力したら、ラジオボタン[解答]を選択して、「解答モード」に移ります。
ここでは、ラジオボタン[1]から[9]までを順次繰り返して選択し、入力可能な場所(後述の「数字入力のルール」を参照してください)があれば、そこでクリックします。すると、青色のイタリックで数字が入力されます。この数字入力も、上書きやラジオボタン[取消]で訂正できますが、解答入力を慎重にやれば、訂正の必要は滅多にありません。全体を訂正したい場合には、[解答クリヤ]ボタンをクリックして、解答入力全部を取り消すことができます。
「解答モード」は、このプログラムの最も楽しめるところです。安易に次の「試行モード」に移らないで、じっくりと数字パズルの楽しさを満喫してください。ラジオボタン[1]から[9]までの順次繰り返しは、十分な回数を必要とします。中級レベルのほとんど、上級レベルの比較的易しいものは、この「解答モード」だけで十分解けます。
試行モード
どうしても残りの空欄を埋めることができなくなったら、ラジオボタン[試行]を選択して「試行モード」に移ります。このモードで入力すると、数字が赤色のイタリックで表示されます。これらの数字は、[試行クリヤ]ボタンで容易にクリヤできますので、何度でも試行錯誤することができます。どのようになったら失敗なのかは後述します(図4参照)。
数字パズル解法のルール
ルールと言っても、コンピュータが自動的に実行するのではなく、ユーザーが自分の意思で入力しますので、一応これに従っていれば解答が得られるという意味です。以下に示すものは一例で、他にもいくつかのルールがあります。興味ある方は研究してください。
一箇所だけ空欄がある場合
3×3のサブマトリックス、横列、縦列いずれかに、一箇所だけグレイ表示されていない空欄があれば、そこが新規に入力する場所です。入力すべき数字を1から9まで何回も繰り返して埋めてゆきます。これだけで、初級の問題は十分解けます。
図1は、入力すべき数字が「1」(ラジオボタン[1]が選択されている)の時に現れた画面の例です。白い空欄が3×3のグリッドの中に1個(右中央)しかありませんので、この場所が「1」の入るべき場所です。ここでクリックすると「1」が入ります。空欄が2個以上ある場合には、十分な理由がない限りどれかをクリックしてはいけません。
図2は横列の場合を示します。入れるべき数字が「9」の時の画面の例です。白い空欄が左から3番目のマスのみですから、ここでクリックすると、そこに「9」が入ります。
縦列に1箇所だけ空欄がある場合でも同じです。
入力可能な数字の候補が2個で、同じ組み合わせが2箇所にある場合
図3は少し高度な例です。「2 4」の可能な組み合わせが、同じ横列に2箇所あり、「2」と「4」は必ずこの2箇所に入ります。従って、一番左のマスに「4」が入ることはありません。従って、一番左には「8」が入ります。ラジオボタン[8]を選んで、この場所に「8」を入れましょう。このほか、「2 4」「2 4」「2 4 6」とある場合は、「2 4 6」のマスには「6」が入ります。
「試行モード」で失敗の場合
試行モードで数字入力を続けて行くと、図4のような状態に遭遇することがあります。白い空欄がなく、入力候補の数字のないマスが3箇所もあります。これは、エラーが発生したのです。これらは、今までの入力に誤りがあったことを示しています。[試行クリヤ]ボタンで、試行による入力をクリヤしてください。
プログラムの実行結果
図5は、実行画面の全体を示したものです。あらかじめ準備されている(アプレット起動時に読み込まれる)問題をそのまま使用し、「解答モード」にして、数字「7」を入力できる場所を探しているところです。左上と下中央のサブグリッドに入力できます。これらのサブグリッドで白い空欄をクリックすると、そこへ数字「7」が青色のイタリックで入ります。
図6は、解答入力が進んだ状態を示します。もう入力できる場所がないと思うかもしれませんが、よく注意して見てください。まだまだあります。
図7は、図6の状態から、意図的に「試行モード」に移って、ある程度のカンを働かせながら(論理的ではない)試行の数字を入力(赤色)した結果を示しています。幸いに、一回の試行で完全な解答に到達することができました。
まとめ
数字パズルが流行し、プログラム愛好家の格好のターゲットとなって、数多くの優れたソフトがネット上に提供されています。多くは、バックトラッキング法を用いて自動的に解くもので、プログラマには面白くても、数字パズルファンにとっては面白くありません。本稿は、プログラム的には価値のやや低いものですが、数字パズルを解く楽しみをユーザーに与えることを目標にしました。これによって数字パズルの愛好家が増えれば幸いです。
なお、ここで使用した数字パズルの問題は、筆者が考えたものです。専門家による作品と比べると幼稚なものでしょうが、中級の易しい部類に属し、「解答モード」だけで容易に解けます。
このプログラムを使用した感想があれば、ぜひコメントしていただけると幸いです。「もっとここを改良したら」「便利なので今後活用したい」「邪道なのであまり使いたくない」など、何でも結構です。
面白い改良案などがあれば、ご投稿もお待ちしております(編集部)。
参考資料
数字パズルの歴史から解法まで、すべて下記から調べることができます。
- Wikipedia 『Sudoku』