【C#】【数独】解析ロジック(仮置き矛盾チェック)を考える

前回までの状況はこちら

最新ソースはこちら(gitHub)

https://github.com/takishita2nd/sudoku

さて、以下のような問題が出題されたとき、解析が止まってしまう現象が発生しました。

例えば、数字の2に注目した場合、

オレンジの2箇所と青の2箇所が数字の2が入る可能性があるのですが、今までのロジックでは値が確定しないため、解析が進まない状態となってしまいます。

この場合、仮置きというやり方をします。

例えば、

オレンジのマスに数字2を置いた場合、今までの解析ロジックから青のマスに2が入りますが、同じライン上に2がすでに存在しますので、この置き方は誤りと言うことになります。

逆に、このように置けば、矛盾が発生しませんので、このマスに入る数字は2で確定する事になります。

これをプログラムでロジック化します。

やり方をまとめます。

解析ループ処理に変化が無かった場合、仮置きロジックを適用します。

解析途中のデータを複製し、空いている箇所に、仮の値を置き、通常の解析ロジックを実施します。

その結果、矛盾が発生していれば、その複製データを破棄します。

矛盾が発生していなければ、その値で確定します。

値が確定すれば、その状態で解析を継続します。

ざっくり言えばこんな感じですね。

次回以降、もう少し細かいところを詰めて、実装していこうと思います。

「【C#】【数独】解析ロジック(仮置き矛盾チェック)を考える」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください