数独を生成するアルゴリズムを作成しましたが、それはひどく非効率的でした。各パズルの生成には数分かかりました。だから今、私はそれを最適な方法で書き直そうとしています。しかし、私は助けが必要ないくつかの問題を経験しています。
2つのアプローチがあります:
- 空白のグリッドから始めて番号を追加し、それが解決可能かどうかを確認します。
- 81個の数字すべてで完全に有効なグリッドを作成し、残りの数字の数に満足し、それでも解決できるまで削除します。
最初は最初のアプローチを使用しましたが、より効果的だと思うので、次に2番目を使用します(解決可能であることが保証されている有効なパズルから始めます)。私は2番目のアプローチがより良いというのは正しいですか?
完全に実装されたグリッドを生成しようとすると、問題が発生します。私のアルゴリズムは次のとおりです。
- 各セルの候補を設定します。最初は1から9までの数字です。
- 値のないランダムなセルを選択します。
- そのセルからランダムな候補を選択し、セル値として割り当てます。他の候補は破棄されます。
- ここで、割り当てられたセルに対応する各行、セル、および正方形について、これらの候補からセルの値を削除します。したがって、各番号は行/列/正方形で一意です。
- 繰り返す
この手法は、重複する番号のないランダムグリッドを保証します。ただし、ほとんどの場合、配置のルールに違反しないと、競合が発生します。たとえば、すべての候補が削除された空のセルなど、最初からやり直す必要があります。配置のルールを破ることなく、グリッド全体を数字で埋める、よりエレガントで効率的な方法はありますか?