0

4x4 の特定の数独の自動解決策をコーディングする必要があるという問題があります。これは、数字が 1 2 3 4 までしか進まないことを意味します。私はまだプログラミングに慣れていないので、これは数独の単純化されたバージョンです。

そこからランダムな数独が生成された特定のテンプレートがあり、数独を自動的に解決するコードを作成する必要があります。
これが私が解決しなければならない数独として最初に持っているものです

sudoku[6] = [[" ","2"," "," "],
             [" "," ","2"," "],
             [" "," "," ","3"],
             ["4"," "," "," "]

私の考えは、「1234」を空の「」に挿入し、列、行、および象限に数字の1つが既に存在する場合、「1234」から数字を削除することでした。だから私がやりたかったのは、ループを使用してテーブル内のすべての位置を通過し、たとえば「1」だけを見つけた瞬間に、「1234」から 1 を削除することです。

これが私のコードの始まりです。ifに到達した瞬間に機能しないようです。何が間違っているのか、またはIfに到達したときになぜ機能しないのか教えてください。前もって感謝します。

var sudoku = sudoku[6];

// function to put "1234" into empty space ""
var concatenate = function (s)
{ 
   for (i=0; i<s.length; i++)
       for (j=0; j<s.length; j++)
            if (sudoku[i][j] === " ")
                sudoku[i][j] = "1234";
};

concatenate(sudoku);

// function to solve the sudoku automatically. 

var solve = function (t)
{ 
    for (i = 0; i<t.length; i++)
       for (j=0; j<t.length; j++)
           for (k=j; k<(4+j); k++)
                if (sudoku[i][j].length === 1)    // this is where it seems to bug, in this if im trying to find the position where we only have one number and not "1234"
                    var s = sudoku[i][j];
                if (sudoku[i][k-j] !== ("1" || "2" || "3" || "4"))  // here im finding the position of all position in the sudoku where ive got "1234" so i can remove the number found in the previous if.
                    {
                        var index = sudoku[i][k-j].indexOf(s);
                        var string_new = sudoku[i][k-j].substring(0,index) + sudoku[i][k-j].substring(index+1, 4);
                        sudoku[i][k-j] = string_new; 
                    }
};
4

2 に答える 2

0

数独問題を解決する既知のアルゴリズムがあります。ぜひ調べてみてください。

あなたのような小さな数独の場合、計算時間を考慮せずに実装することを選択できます。(実装が最も簡単なものを選択してください)

詳細情報:数独解決アルゴリズム

あなたのコードを尊重すると、(紙の上での) アイデアは悪くありませんが、あなたがそれで何をしようとしているのか本当に理解できません。例えば:

if (sudoku[i][k-j] !== ("1" || "2" || "3" || "4"))

この行には意味がありません。式 ("1" || "2" || "3" || "4") は常に "1" と評価されます。だからあなたは書いています:

if (sudoku[i][k-j] !== "1")

さらに、sudoku[i][kj] は "1234" (またはその一部) を含む文字列であるため、文字の存在を確認するには indexOf を使用する必要があります。

そして、内部の用途は何ですか?

  for (k=j; k<(4+j); k++)

j から 4+j まで繰り返すのはなぜですか? 常に kj を使用して変数 (sudoku[i][kj]) にアクセスします。これは常に jj と 4+jj の間です。それでは、次のことをしないでください。

  for (k=0; k<4; k++)

コードには他にも論理エラーがあります... そのアイデアを実装したい場合は、時間をかけて何を書いているかを考えるか、(より良い) 既知のアルゴリズムを使用する必要があります。

于 2013-11-12T07:33:48.717 に答える
0

これを置き換える必要があります:

if (sudoku[i][k-j] !== ("1" || "2" || "3" || "4"))

このようなものに:

if ( sudoku[i][k-j] !== "1" || sudoku[i][k-j] !== "2" || ...

または、switchステートメントの使用も検討できますが、それで苦労しているバグが解決するかどうかはわかりません...

于 2013-11-12T08:35:11.427 に答える