複数解の検出プログラム

バックトラック法は、順次、空マスに数字を置いて、数独のルールを
満たすか確認する。ルールを満たせば、次の空マスに移り、
同じ要領で数字を置いていく。ルールを満たさなければ、数字を置いた
マスを空にして、1マス戻る。
盤面が唯一解の場合はその解を返す。複数の解がある場合、とりあえず
最初に見つけた解を戻り値として返す。
バックトラック法で解を見つけた場合、その解が唯一解であるかの
判断は若干の工夫がいる。
バックトラック法では最初の解を返すので、数字を入れる空マスの
順序を替えれば、別の答えを見つける可能性がある。このことを
利用して数独の複数解の検出を行う。
数字を入れる順の一例
(1) 盤面の左上の空マスから、右にむかって行順で数字を入れる。
(2) 盤面の右下の空マスから、左にむかって行順で数字を入れる。
(3) 盤面の左上の空マスから、下にむかって列順で数字を入れる。
(4) 盤面の右下の空マスから、上にむかって列順で数字を入れる。
(5) 左上のブロックからブロック単位で行順に数字を入れる。
(6) 右下のブロックからブロック単位で行順に数字を入れる。
このほかにも、いろいろな数字の入れ方が考えられる。
簡単な操作で複数解の検出ができるプログラムを下記のサイトに載せる。
game81のページ
NpValidLEプログラム
操作方法
(1) ラジオボタンで課題を選択する。Web版プログラムの組込みの
課題数は5個に制限している。
kadai1、kadai2 複数解の問題
kadai3~kadai5 唯一解の問題
(2) Check Validボタンを押す。
この時の盤面をAとする。
(3) もう一回、Check Validボタンを押す。
この時の盤面をBとする。
盤面A、あるいは盤面Bで青い数字のマスと空マスがある場合、
複数解の問題と判断する。
(4) もう一回、Check Validボタンを押す。
これは(2)と同じ盤面になる。
(5) とりあえず、1つの解を知りたい場合は、Check Boxボタンを押す。
盤面Cとする。
解説
盤面Aは盤面の左上の空マスから、右にむかって行順で数字を入れて
解いた答えと、盤面の右下の空マスから、左にむかって行順で数字を
入れて解いた答えの共通部分を表示している。
盤面Bは盤面の左上の空マスから、右にむかって行順で数字を入れて
解いた答えと、数字を1から9ではなく、9から1へと入れて解いた
答えの共通部分を表示している。
盤面Cは左上のブロックからブロック単位で解いた場合の答えを
表示している。盤面Cは差分を取っておらず、解があれば、すべての
マスが数字で埋まっている。
追加の説明
画面上の白い枠はテキストフィールド欄。ここにA形式の1行文字列を
入力すれば、任意の問題で複数解の確認を試すことができる。
A形式の1行文字列の一例
A807m5 609k830 5k6h20 4h5h20 28k 809k70 403k2 29m104 5h906h
画面下側のステータス行
status(22) A 345678/567 res=5
数字22 ヒント数(表出数字の個数)
A 盤面
345678/567 バックトラック法で試しに置いた数字の回数の1回目/2回目
バックトラック法で試しに数字を置く回数の上限を設けており、回数が
100万回を超える場合は、試しを終了する仕様にしている。
このプログラムはアルゴリズムの点で複数解の問題であるにも
かかわらず、複数解と検出できない見逃しエラーがあるので
注意する。また、アルゴリズムから唯一解の問題を複数解とする
誤判定はないと考えている。








Nsは初手のときの盤面のコマ数
メニュー View - show Next Stepで表示する画面の下側






