【问题标题】:Sudoku solver with recursion and backtracking具有递归和回溯的数独求解器
【发布时间】:2015-08-20 14:57:14
【问题描述】:

我正在尝试编写具有递归和回溯的数独求解器。但是我的代码存在一些问题,它总是返回 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;
}

【问题讨论】:

  • 你不重置任何地方的值,你怎么能回溯?

标签: java recursion backtracking


【解决方案1】:

尝试在return false前加上model[row][col] = 0;

【讨论】:

  • 非常感谢!这是我在代码中遗漏的一件事。
【解决方案2】:
return next(row, col);

应该是

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

而带有 == 0 的 if 似乎没有任何意义。


全部完成

未经测试但有正确的回溯:将单元格再次设置为 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;
}

【讨论】:

  • 感谢您的评论...我仍然遇到同样的问题...它仍然返回错误...我将 ==0 更改为 != 0 ...因为有程序中的用户输入也可以检查。
  • 非常感谢!这非常有帮助,现在我的代码正在运行!
猜你喜欢
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多