我的数独求解器无法正常工作

时间:2015-08-20 14:57:14

标签: java recursion backtracking

我尝试使用递归和回溯来编码数独求解器。但是我的代码存在一些问题,它总是返回false。我尝试调试,它调用next(int row,int col)方法直到第二行,第六列,然后停止并开始回溯。问题是回溯持续到我的数独游戏中的第一个单元格然后它返回false。它不会取代其他人的细胞数量。

这是我的代码......我错过了什么吗?

/** Calls solve for the next cell */
private boolean next(int row, int col) {

    if (col < 8)
        return solve(row, col + 1);
    else
        return solve(row + 1, 0);
}

public boolean solve(int row, int col) {

    if (row > 8) {
        return true;
    }
    if (model[row][col] != 0) {
        if (isSafe(row, col, model[row][col]))
            return next(row, col);
    }

    for (int value = 1; value < 10; value++) {
        if (isSafe(row, col, value)) {
            model[row][col] = value;
            return next(row, col);
        }
    }
    return false;

}

2 个答案:

答案 0 :(得分:1)

return next(row, col);

应该是

if (next(row, col)) {
    return true;
}

if = = 0似乎没有用。

全部完成

未经测试但具有正确的反向跟踪:将单元格再次设置为0,因此可以再次填充。

public boolean solve(int row, int col) {
    if (row > 8) {
        return true;
    }
    if (model[row][col] != 0) {
        // isSafe may be assumed on correct puzzles.
        return isSafe(row, col, model[row][col]))
            && next(row, col);
    }

    for (int value = 1; value < 10; value++) {
        if (isSafe(row, col, value)) {
            model[row][col] = value;
            if (next(row, col)) {
                return true;
            }
        }
    }
    model[row][col] = 0;
    return false;
}

答案 1 :(得分:1)

尝试在返回false之前添加model[row][col] = 0;;