難問へのアプローチ法
前ページで示した数独(正式版)を解くプログラムを難問に適用してみてください。 多
分、最後まで解けないと思います。 その結果を分析し、新たなポイントを探し出してください。い
くつかのポイントが見つかると思います。 それらをコード化しSOLVERのプログラム
に組込ます。 この作業を多数の難問について繰り返し行えば、 最終的なプログラム
はかなり強力な数独を解くプログラムになるはずです。
以下に、難問を解く上で必要なポイントのいくつかを示します。 コーディングする時に
参考にしてください。 ちなみに、難問でも前ページで挙げたポイントの(5)と(7)を使
えば、未知の数字の約9割は求めることができます。但し、ある数字の一つが判らな
いと次の数字を求めることができないという点で、 これから説明するポイントの重要
性に変わりはありません。
難問に関するポイントを纏めてみます。
(1’)縦及び横に並んだ各9つの数字の内そのいくつかが判らなくても、 その列また
は行が属する太枠内の数字の情報からそれらを決定できる場合がある
<(1’)に関する説明図>
(図1、十進BASICによる2Dグラフィックス)
下から6行目の9つの数字が属する太枠内の内、 左右の太枠内にある緑マルの数
字と同じ数字が真ん中の太枠内の黒マルの位置に入ることに注意してください。
(2’)縦及び横に並んだ各9つの数字の内そのいくつかが判らなくても、 その列また
は行が属さない太枠内の数字の情報からそれらを決定できる場合がある
<(2’)に関する説明図>
(図2、十進BASICによる2Dグラフィックス)
左から5列目の9つの数字が属さない太枠内の緑マルの数字と同じ数字が、 属する
太枠内の黒マルの位置に入ることに注意してください。
(3’)は(1’)と(2’)のコンビネーションです
(4’)太枠内の判らない特定の数字のマス目は枠外のその数字の情報(但し、 その
一部の数字のマス目が正確に判らなくても)から決定できる場合がある
<(4’)に関する説明図>
(図3、十進BASICによる2Dグラフィックス)
左側の一番下にある太枠内で緑マルと同じ数字のマス目の位置が正確に判らなくて
も、緑円のどちらかのマス目に入ることが判れば、 左側の真ん中にある太枠内の黒
マルの位置にその数字が入ることに注意してください。
課題(その1)
上記で示したポイントをコード化してください。また、それらのコードをSOLVERのプロ
グラムに組込んでいくつかの難問に挑戦してみてください。
課題(その2)
上記で示したポイント以外に、難問を解く上で必要なポイントはありますか。
ポイントの(1’)と(2’)をコード化する上で参考になる例を示して置きます。難問を解
く為には、ポイントの(4’)のような高度なテクニックが必要になります。時間を節約し
たい方はそのまま使ってください。(1’)、(2’)そして(3’)を追加しただけでも、難問
のいくつかは解けるようになります。
ポイントの(1’)に関するコード例です。
他の行や列に関するコードは省略します。
ポイントの(2’)に関するコード例です。
上記のコードでは、行が属する太枠内の数字もチェックしています。他の行や列に関
するコードは省略します。
課題(その3)
もし可能ならば、ポイントの(1’)、(2’)そして(3’)を統合した形でコード化してくださ
い。
上記のポイントを全て考慮したSOLVERのプログラムはかなり大規模になります。こ
れに伴い コンピュータへのプログラムの読み込みにも多少時間がかかるようになり
ます。とは言え、問題を解く時間は1秒以下なので、最高難度の問題に適用してSO
LVERのさらなる改良に挑戦してみてください。