前回までの状況はこちら
最新ソースはこちら(gitHub)
https://github.com/takishita2nd/sudoku
さて、以下のような問題が出題されたとき、解析が止まってしまう現象が発生しました。
例えば、数字の2に注目した場合、
オレンジの2箇所と青の2箇所が数字の2が入る可能性があるのですが、今までのロジックでは値が確定しないため、解析が進まない状態となってしまいます。
この場合、仮置きというやり方をします。
例えば、
オレンジのマスに数字2を置いた場合、今までの解析ロジックから青のマスに2が入りますが、同じライン上に2がすでに存在しますので、この置き方は誤りと言うことになります。
逆に、このように置けば、矛盾が発生しませんので、このマスに入る数字は2で確定する事になります。
これをプログラムでロジック化します。
やり方をまとめます。
解析ループ処理に変化が無かった場合、仮置きロジックを適用します。
解析途中のデータを複製し、空いている箇所に、仮の値を置き、通常の解析ロジックを実施します。
その結果、矛盾が発生していれば、その複製データを破棄します。
矛盾が発生していなければ、その値で確定します。
値が確定すれば、その状態で解析を継続します。
ざっくり言えばこんな感じですね。
次回以降、もう少し細かいところを詰めて、実装していこうと思います。
「【C#】【数独】解析ロジック(仮置き矛盾チェック)を考える」への1件のフィードバック