先日来、奮闘しておりました数独自動回答アプリが完成しましたので、ここに公開致します。
補助レベルを設定出来るようにしていますので、補助なしで、新聞とか雑誌に載っている数独を入力して、自力で回答するときのツールとして利用する事も出来ます。難問を数秒で解くことも出来ます。
以下はかなりの難問を回答している時の動画です。
zip ファイルをクリックして、エクスプローラに出て来た Setup.exe を実行してインストールしてください。ナンプレの問題もいくつか一緒に入っています。
仕様については、以下に追って解説させて頂きます。
問題選択
左上にある問題選択ボタンを押すとファイル・ダイアログが現れます。
ここで、Numpre*.txt の問題ファイルを選んで、問題を読み込みます。
問題入力
用意した問題以外に自分で問題を入力することが出来ます。画面上方の問題入力ボタンを押します。
下図の問題入力フォームが現れます。
上方のTextBox にスペースと数字を入力して行きます。1行分の9桁を入力すると下のTextBoxに移されて行きます。その際に分かり易い様にスペースはアンダーバーに変換されます。
全て入力が終わりましたらOKボタンを押します。
必要であれば、保存ボタンで問題を保存します。
補助レベル
上方中央にある↑ボタンで補助レベルを0~5に設定します。各補助レベルの動作については後述しています。
メモ機能
左下のMEMOボタンを押すとメモモードになります。
空きのマスをクリックするとメモ群がそのマスの上に移動します。1~9をクリックするとその色が変わりメモされます。
別のメモを残しておきたいマスをクリックすると、メモ群がそちらに移動します。
すでにメモしているマスでは、メモしている数字の色が変更されて表示されます。
数字の入力
数字の入力は、左下のINPUTボタンを押してインプットモードにした後、入力したい数字を選んで、カーソルを入力したいマスに持って行きます。
そのマス目の上で十字カーソルになればマウスボタンを押すと入力されます。
入力したい数字を変えたい場合は、他の数字をクリックするか、選ばれている数字を再びクリックすると選択解除されます。
以下のようにその数字がすべて入れ終わった時には、INPUTエリアのその数字は表示されなくなります。
補助レベル 0
補助レベル 0 では、クリックしたマスのバックカラーを変えるのみです。
赤丸をクリックして青〇をクリックすると、その間もすべて色を変えます。逆方向も、縦方向も出来ます。
すでにグリーンになっているマスをクリックすると白に戻します。
右下の ClearAllColor ボタンをクリックすると空白マスは白に、数字のマスはグリーンに変えます。
メモモードで候補数字のメモはできます。
補助レベル 1
数字マスをクリックしたとき
補助レベル 1 で数字のあるマスをクリックしたときは、その数字のある縦、横、ブロックのバックカラーをグリーンに変えます。
これにより、この例の場合2で次の2か所が判明します。
空マスをクリックしたとき
補助レベル 1 で空きマスをクリックした時は、そのマスに入る可能性の数字をメモで表示します。
上図では、左中央のブロックの空きマスをすべて表示させた状態ですが、4が入る可能性のマスが分かります。また、そこに4を入れると、おのずと右下のマスには7が入ることが分かります。
ヒント表示
ある程度メモを表示して、シングル、ヒドゥンシングルがみつかるとヒントの電球が表示されます。
自力で探して入力してもいいですが、ヒントボタンを押すと、シングル、ヒドゥンシングルを赤く表示します。
補助レベル 2
数字マスをクリックしたとき
同じ数字のすべてで、縦、横、ブロックのバックカラーを変更します。同じ数字を再度クリックすると元に戻します。
空マスをクリックしたとき
すべての空きマスで、候補数字のメモを表示します。メモが表示されている場合は、すべてのメモを消します。
補助レベル 3
数字マスをクリックしたとき
数字の入ったマスをクリックしたときは、同じ数字のすべてのバックカラーを黄色に、その数字が入ることが出来ないマスのバックカラーを緑に変えます。縦、横、ブロックでその数字が入ることができるマスが見つかれば、そこに数字を入力しバックカラーを赤く変えます。
バックカラーの赤いマスをクリックすると、さらに同じ数字での作業を続けます。
空マスをクリックしたとき
空白マスをクリックしたときは、すべての空白マスにおいて入る可能性の数字をメモします。
メモした結果からシングルの箇所があれば、そのメモのバックカラーを赤く変えます。
赤く変わったメモのマスをクリックすると、その数字を入力します。続けて空白マスをクリックすることにより、同じ作業を続けます。
シングルが見つからなければ、左下に チェックNKP チェックNKT のボタンが現れます。
チェックNKP は、ネイキッドペアを探して処理します。その結果、シングルが見つかれば、そのメモを赤く変えます。赤く変わったメモをクリックすると、数字が入力されます。
チェックNKT は、ネイキッドトリプルを探して、上記と同じ動作をします。
ネイキッドペア、トリプルが見つからなくなれば、またはシングルが見つかれば、ボタンは消えます。
スナップショット
下方にあるカメラマークを押すと、その時点のスナップショットを撮ります。
スナップショットは、仮定法を試すときに使います。これまで、こちらの解き方1,2,3で行き詰まった時点で、候補数字が二つだけのマス目で、候補のどちらかの数字を入力して前に進めますが、もし間違っていた場合は、その時点まで戻す必要があるため、そこでスナップショットを撮っておきます。
上図で行き詰まったとします。
上図の赤枠のマスの候補数字は、1,3でした。1と仮定して前に進みたいので、1を入力します。その後、カメラマークを押して1枚目のスナップショットを撮ります。スナップショットを撮ると番号のついたパネルが表示されます。このパネルをクリックすると、この時点のスナップショット画面まで戻ることが出来ます。
スナップショットを撮った後、進めるとまた下図で行き詰まりました。つぎは、赤枠を3と仮定して進めます。
3を入力して2枚目のスナップショットを撮りました。
しばらく進めると下図のように矛盾する結果となりました。これは、いままで仮定して来たものが間違っていたことを意味します。ですので一つ前のスナップショットまで戻ります。
直前のスナップショットのパネル2をクリックし戻りました。スナップショットを撮った時には、直前に変更されたマスのメモも記録しています。これで、このスナップショットの時点では、赤枠のマスの候補数字は、3,7 だったので 3と仮定したと分かります。これで矛盾した結果となったので、次は7と仮定して進めます。マス目に数字が入っている状態で、メモも表示されているマス目をクリックすると数字をメモの次の候補に入れ替えるようにプログラミングしていますので、ここをクリックすると3が7に変わります。
7に変わりました。この時点では候補数字の最後の数字を入れたことになります。これで前に進めてまた矛盾した結果となった場合は、ここより前に仮定した箇所が間違っているということなので、この時点より前に戻すことになりますので、ここではスナップショットを撮る必要はありません。
このようにして、行き詰まったら候補が二つのみのマス目で(なければ三つにも対応)、数字を仮定入力して、スナップショットをとり、矛盾した結果となれば、スナップショットの時点まで戻って、数字を入れ替えて進める。 これを繰り返すことにより回答を得ることが出来ます。
補助レベル 4
補助レベル 4 では、上記のメモ機能、スナップショットを利用して、自動的にシングル、ヒドゥンシングルを発見して入力、行き詰まったらスナップショットを撮って仮定法を施行します。
具体的な動きは、
- 全マスでメモを表示
- シングル、ヒドゥンシングル、を検索
- 有った場合は、シングル、ヒドゥンシングルを赤色表示 ー>入力
- 無ければ、ネイキッドペア、トリプル、クワッドを処理
- 4の結果、シングル、ヒドゥンシングルが見つかれば、赤色表示 ー>入力
1-5 を繰り返して、シングル、ヒドゥンシングルが無ければ、以下から仮定法を実施。
- 候補数字が二つのみのマスを検索、無ければ三つのマスを検索
- 見つかったマスで、候補数字の若い数字を入力
- スナップショットを取得
- 前のリストの1-5を実施
- シングル、ヒドゥンシングルを検索、矛盾がないかをチェック
- 矛盾が無ければ、数字を入力して、4から繰り返す。
- 矛盾ありの場合は一つ前のスナップショットまで戻る。
- 戻った時点で前回仮定したマスにもう一方の数字を入力した後、4から実施する。(この時点が最初の仮定したポイントであれば、この数字は決定です)
- 6-7の時点で、シングル、ヒドゥンシングルが見つからず行き詰まったら、1に戻って更に仮定法を試みます。
- どんどん仮定法を積み重ねて行ってスナップショットが10回溜まって更に行き詰まったら、最初に仮定する数字を若い数字から、大きい数字に変更するモードに切り替えて、スナップショットの1に戻ります。
プログラム更新事項
ネイキッドペア、ネイキッドトリプル、ネイキッドクワッド
補助レベル 2 でネイキッドペア、トリプル、クワッドをチェック出来るようにボタンが現れるようにしました。ネイキッドを検索して、メモを更新します。メモ更新の結果、シングル、ヒドゥンシングルが見つかれば、そのメモを赤色に表示します。
リバースモード・ボタン
画面の右下にリバースモードのオフ・オン ボタンを追加しました。背理法(仮定法)を試みる場合に二つの候補数字のどちらを先に入れるかを決めます。 RVS OFF では、常に候補数字の内の若い数字を先に仮定します。RVS ON では、古い数字を仮定します。ボタンを押す毎にオフ・オンを繰り返します。
直前に消したMemo Labelの表示を変更
直前に消したmemo label を 取り消し線で表示するように変更。
シングル、ヒドゥンシングルのチェックタイミングを調整
発見したシングル、ヒドゥンシングルの数字入力毎に次のシングル、ヒドゥンシングルをチェックしていたものを、全て入力後にチェックするように修正。ヒント電球が点灯時は、次のシングル、ヒドゥンシングルはチェックしないように修正。