数独ボードを生成するためのアルゴリズムを書いていますが、失敗しています。私はthisに基づいてそれを書いていますが、私はこれに遭遇する前に多くのコードを書いていたので、それは異なります。数独ボードを生成するためのバックトラッキングアルゴリズムのヘルプが必要
コード
私はmatrix
と呼ばれる値を保持するための設定多次元配列を持っています。 matrix
は、行である9つの配列で構成され、それぞれが9つの列を保持します。 generatePossibleNumbersArray()
がmatrix
のように正確に多次元配列を作成するためだけのヘルパー関数です
var populateMatrix = function() {
var possibles = generatePossibleNumbersArray();
var found = false;
for(var i=0; i< matrix.length; i++) {
for(var j=0; j< matrix[i].length; j++) {
while(possibles[i][j].length > 0) {
var rnd = Math.floor(Math.random() * possibles[i][j].length);
var num = possibles[i][j].splice(rnd, 1)[0];
if(isValid(i, j, num)) {
matrix[i][j] = num;
found = true;
break;
} else {
found = false;
continue;
}
}
if(!found) {
possibles[i][j] = [1,2,3,4,5,6,7,8,9];
j -= 2;
}
}
}
}
:だから私はすべての正方形を解決するための
matrix[3][6];
機能を使用することになり、行4列7の値を取得しますただし、各セルの整数1〜9の配列を保持するように初期化されています。 populateMatrix()
機能の間、これらの可能な数字は各セルごとに縮小されます。
問題
j
が-1
されて終わるので、それは行列を毎回完了する前に失敗しました。これは、より多くのセルが解決されるにつれて、アルゴリズムがセルの値を見つけ出してバックトラックするのがより困難になるからです。しかし、それは最終的にj == -1
まで戻ってバックトラッキングを終わります。
私は本当にこのアルゴリズムが働くだろうと思って、私はこのまわりで私の頭を取得しようとしているすべての一日を過ごしてきましたが、私は誰もがこれに当てる可能性のある光は非常に高く評価されるだろうので困惑しています。
「私が知っていると思うと、私は数独を解決するためのjavascript関数を書いていきます。それはどれくらい難しいでしょうか? "私は間違っていた。
@ Steve314によってコメントに基づいて、[ソリューション]
(彼は今削除しています!)私はif(!found) { ...
にmatrix[i][j] = undefined
を追加し、アルゴリズムが機能するようになりましたし、高速軽量化されます。
興味があれば、complete codeです。
したがって、コードは適切な時間内に行列を解くか、または解きませんか? –
@Joãoループカウンタ「j」が「-1」になり、 'matrix [i] [j]'が未定義になるため、コードは失敗します。 – MrMisterMan
これは正常ではありませんか?それは、あなたが行き詰まったと言っているようなものです。以前のポジションは有効な値で埋めることができますが、現在のポジションを埋めることは不可能です。だから、あなたは前の充満した位置に行き、そこで次の有効な値を続けることを試みるべきです。 –