数独プログラムの正式版への拡張
数独の簡易版で検討した内容をもとに、数独の正式版の問題作成プログラムを作っ
てみましょう。下図は、正式版のマス目です。 簡易版もそうですが、この種のパズル
では、未知数の数がルールから決まる方程式の数よりも多いので、単純に連立方程
式を解く形で正解を探すことはできません。 したがって、RND関数を使って、マス目
に入る数字をランダムに振って数字の組み合わせを決定しています(図1参照)。
一つのマス目に入る数字を決定するコードは次のようになります(簡易版と同様)。
DO WHILE 条件式
LET A(I、J)=INT(9*RND)+1
LOOP
A(I、J)は各マス目の数字に対応する配列です。A(1、1)は一番左側にある一番下
側の数字に対応します。 この数字から始まってA(1、2)、A(2、1)という順に数字を
決める場合には、A(2、1)に関する条件式は、
(A(2、1)=A(1、1))OR(A(2、1)=A(1、2))
となります。後は、数独のルールに従って、順番に数字を決定して行けば良いわけで
す。ただし、残りの数字が少なくなってくると、1から9までのどの数字を入れても解に
ならない場合が出てきます。 そのときは、 その手前の段階まで戻って数字の決定を
やり直してください。A(1、1)から再スタートさせるというのも、一つの選択肢です。
LET K=1
DO WHILE 条件式
A(I、J)=INT(9*RND)+1
IF K=ループ回数の上限 THEN GOTO 戻す先の行番号
LET K=K+1
LOOP
以下のような数字の組み合わせが多数あることに注意してください。
課題(その1)
数字の組み合わせは何通りありますか。 まずは、 簡易版で考えてみてください。 ま
た、対角線上に並んだ数字がダブらないような組み合わせを見つけてください。
<数独の正式版、自動生成された数字の組み合わせ>
(図1、十進BASICによる2Dグラフィックス)
上のプログラムで自動生成した数字の組み合わせを使って、数独の問題を作成する
ことになります。 以下の図は、自動生成した数字の一部をブランキングしたものです
。ブランキングされた位置に、ただ一組の数字が入れば、問題は完成することになり
ます(図2参照)。
<数独の正式版、ブランキングされた数字、図1とは異なる>
(図2、十進BASICによる2Dグラフィックス)
上図では、 ブランキングされている数字も併せて表示しました。 それでは、以下に、
この問題作成プログラムを使って作った数独の例を示します。 解のユニークさは人
間がチェックしています(図3から図6を参照)。
<数独の問題(その1)>
(図3、十進BASICによる2Dグラフィックス)
<数独の問題(その2)>
(図4、十進BASICによる2Dグラフィックス)
<数独の問題(その3)>
(図5、十進BASICによる2Dグラフィックス)
<数独の問題(その4)>
(図6、十進BASICによる2Dグラフィックス)
課題(その2)
数独(4X4−4X4)の数独プログラムを作ってみてください。数字が16個必要にな
りますが、これにはアルファベットを使えばいいでしょう。
例)1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、G