Sudokuルール
Sudoku Gamesでは、9×9 = 81セルで構成される古典的な9ケージグリッドと、3×3 = 9の小さな9ケージグリッドも形成されます。 81個の小さなセルで1〜9の数値を記入する必要があり、各行、列、および各小さな9ケージグリッドで数値を繰り返すことはできません。
Sudokuスキル
私の考え
ソリューションの設計と実装
Sudokuスキームの保存には2次元配列のみが使用され、1次元配列がスタックとして使用され、ブール変数がバックトラック識別として使用されます。
1。変数定義:
var問題= [//これは、本[8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]、[0,5,0,0,0]、[0,5,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0]に記載されている難易度10.7の問題です。 [0,0,0,0,0,4,5,7,0,0、0]、[0,0,1,0,0,0,0,3,0]、[0,0,1,0,0,0,0,0,6,8]、[0,0,8,5,0,0,0,0,0,0,1,0]、[0,0,0,0、0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,. stack = []、flag = false;
2。計画の有効性の決定:
JavaScriptオブジェクトのハッシュ機能は完全に利用されています。デバッグを容易にするために、関数の返品値は有効な場合は0であり、無効な場合は3つの状況があります。それぞれ1、2、および3を返す9部構成のグリッド競合。私はそれを初期の判断で使用し、後に関連する21の判断を追加しました。この関数は、答えを探すときはもはや使用されません。
function checkvalid(sudo){let subsudo = {} // auxiliary変数9番目のグリッドが(i = 0; i <9; i ++){let row = {}、col = {} // rowsとcolumnsが競合するかどうかを決定するために使用されるauxiliary変数のuxiliary変数{let row = {} // sudo [i] [j]、cur2 = cur2 = sudo [j] [i] //承認された変数完了行と列の判断は同時に行われます(row [cur1])//現在の要素が行に表示され、ゼロの判断が最適化されます。キーが0の場合、値は0で、追加の判断は必要ありません。返品1; //エラーコードを返すelse row [cur1] = cur1 //現在の要素は行に表示されず、補助変数に保存されます(col [cur2])//列の判断は行に似ています。ゼロの判断が最適化されています。キーが0の場合、値は0であり、追加の判断は必要ありません。戻る2; else col [cur2] = cur2; key = math.floor(i/3)+' - '+math.floor(j/3)//異なるキーが異なる9クライアントグリッドに対して生成されます。キーが0の場合、値は0であり、追加の判断は必要ありません(subsudo [key] [cur1])// 9クライアントグリッドの判断が行の判断と類似している場合、3 else subsudo [key] [cur1] = cur1} else {//グリッドと最初の要素をITに保存しますsubsudo [key] [cur1] = cur1}}} return 0; //プログラムはこれを実行でき、計画が有効であることを示します} 3。関連する20のカテゴリの決定原則は全体的な判断と同じであり、ハイライトは小さなナインケージグリッドの位置にあります。 function check20grid(sudo、i、j){let row = {}、col = {}、subsudo = {} //供給変数(let k = 0; k <9; k ++){let cur1 = sudo [i] [k]、cur2 = sudo [k] [j]キーが0の場合、値は0であり、(row [cur1])return 1; //エラーコードを返すelse row [cur1] = cur1 //現在の要素は行に表示されず、補助変数に保存されます} if(cur2){//列の判断は行に似ています。ゼロ損失の判断が最適化されています。キーが0の場合、値は0です。(col [cur2])戻る場合、追加の判断は必要ありません。 else col [cur2] = cur2; } // 9番目のグリッドへの変換ループ変数の座標は、key = sudo [math.floor(i/3)*3 + math.floor(k/3)] [math.floor(j/3)*3 + math.floor(k%3)]]ゼロ損失の判断が最適化されています。キーが0の場合、値は0です。追加の判断を返す必要はありません。4。トラバーサルソリューション
要素状態で初期値がゼロの要素を使用することは保留中の機能であり、スタックの助けを借りて、追加のストレージスペースは開かれません。
function findanswer(){for(let i = 0; i <9; i ++){for(let j = 0; j <9;){if(rubled [i] === 0 || flag){//現在の位置は、現在の位置に決定するか、または現在の位置に戻る要素の最初の処理です。 2つの状況は異なっているように見えますが、実際には処理が同じです。 flag = falseで1を追加します。 K =問題[i] [j] + 1とします。 //(k <10){//次の法的価値の問題を見つけるために次の法的価値に向かって移動するために検索します[i] [j] = k; // if(check20grid(問題、i、j)== 0){//デフォルトは合法であり、関連する21の判断はstack.push([i、j ++])//トレースバックポイントを保存してブレークにステップを保存します。 } k ++; }(k> 9){//現在の位置で法的価値を見つけることができない場合、トレースバックの問題[i] [j] = 0; //トレースバックの前に戻るrt = stack.pop(); //スタック内のトレースバック情報を取得するif(!rt)//ソリューションの判断なし、return 0 return 0; i = rt [0] // travel j = rt [1] flag = true; }} else {//現在の位置番号にはj ++が与えられます。 }}} return 1; //一連のソリューションを正常に見つけた}