需要帮助回溯算法生成数独板

时间:2011-07-24 19:44:17

标签: javascript algorithm sudoku

我已经编写了一个生成数独板的算法,但它失败了。我是基于this编写的,虽然它确实有所不同,因为在我偶然发现之前我写了很多代码。

守则

我设置了一个多维数组来保存名为matrix的值。 matrix由9个数组组成,这些数组是行,每个数组包含9列。因此,要获得第4行第7列的值,我会使用

matrix[3][6];

解决所有方块的功能:

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;
            }
        }
    }
}   

generatePossibleNumbersArray()只是一个辅助函数,用于创建一个与matrix完全相同的多维数组,除了它被初始化为每个单元格保存一个整数数组1-9。在populateMatrix()函数期间,这些可能的数字会因每​​个单元格而缩小。

问题

每次完成矩阵之前失败,因为j最终为-1。这是因为随着更多单元格得到解决,算法更难以找到单元格的值,因此它会回溯。但它最终会一直回溯到j == -1

我真的认为这个算法会起作用,我花了一整天的时间试图解决这个问题,但是我很难过,所以任何人都可以解决的问题都会非常感激。

我想'我知道,我会写一个用于解决数独的javascript函数。它能有多难?'。我错了。


[溶液]

基于@ Steve314的评论(他现在已被删除!)我将matrix[i][j] = undefined添加到if(!found) { ...中,算法现在可以正常运行并且快速闪亮。

如果有人有兴趣,这里是complete code

1 个答案:

答案 0 :(得分:3)

回溯算法通常会在分支失败时恢复状态并执行下一步可能的移动。因此,如果字段的随机填充创建了一个失败的分支,只需回写原来的那些。