如何使我的求解器做回溯(javascript)

时间:2014-02-04 13:50:47

标签: javascript sudoku backtracking

我参与了我项目的最后一次尝试,但我找不到答案! 我有一个小数独求解器。但是,当它需要做一些回溯时,我无法使它工作。我需要一些帮助。

我的代码有一些荷兰名字,所以让我解释一下:

zoekNul() = findZero()
vierkant = square
CheckRK()= Check row column 
Vulin() = Fillin()

代码尝试1到4(如果square是4x4)然后填充正确的数字。

  [1, 0, 3, 4], 
  [2, 0, 4, 1],
  [3, 4, 0, 2],
  [4, 1, 2, 3]

这样可行,因为它不需要回溯

这不会,因为它必须做回溯:

[1, 0, 3, 4],
[2, 0, 4, 1],
[3, 0, 0, 2],
[4, 0, 2, 3]

这是我的代码:

var sq = [
    [1, 0, 3, 4],
    [2, 0, 4, 1],
    [3, 4, 0, 2],
    [4, 1, 2, 3]
];
var x;
var y;
var nMax = 4;

function zoekNul(vierkant) {
    for (var i = 0; i < nMax; i++) {
        for (var j = 0; j < nMax; j++) {
            if (vierkant[i][j] === 0) {
                x = i;
                y = j;
                return [x, y];
            }
        }
    }
    return [-1, -1];
}

function vulin(vierkant) {

    if (zoekNul(vierkant)[0] == -1) {

        alert(vierkant);
    } else {
        for (var w = 1; w < nMax + 1; w++) {
            if (checkRK(vierkant, x, y, w) === true) {
                vierkant[x][y] = w;
                vulin(vierkant);



            } 
        }
    }

}




function checkRK(vierkant, x, y, w) {
    var bool = true;
    for (var k = 0; k < nMax && bool; k++) {
        if (vierkant[x][k] == w || vierkant[k][y] == w) {
            bool = false;
            break;
        }

    }
    return bool;
}


console.log(vulin(sq));

请注意,我对编程很新。我在老师的帮助下编写了代码。

提前致谢

PS:可以在这里找到一个jsfiddle链接: http://jsfiddle.net/45fuW/

0 个答案:

没有答案