小编Mac*_*aca的帖子

具有反向跟踪的数独求解算法

我正在寻求实现一个非常简单的算法,该算法使用强力反向跟踪来解决数独网格.我现在面临的问题是,我在执行中,我有两个实例变量Sudoku称为类rowcol,对应于空单元格的行和列在代表数独网格二维数组.

当我的solve()方法执行时,它首先检查是否没有任何空单元格,在这种情况下拼图已经完成.否则,同一方法将空单元格的行和列分配给实例变量row和包含网格colSudoku对象.之后,for循环验证通过方法调用可以在该空单元格中放置哪个数字isSafe(int n)(此方法检查是否满足拼图的约束,我可以保证它完美地运行).因此,该isSafe()方法在空单元格中放置一个数字,然后solve()在该Sudoku对象上再次对该方法进行递归调用.

如果我们遇到了无法满足的约束,那么我们将a重新分配0给最后一个row并且col填充了.这就是问题所在!由于程序不断更新rowcol变量,因此每次递归调用都会丢失旧实例.我一直在试图弄清楚如何存储这些值,以便程序可以在回溯时撤消操作.我想过互推colrow到堆栈,但我真的不知道该去哪里.

有人能告诉我解决这个问题的简单方法是什么?我不包括整个班级,如果你觉得它有用,请告诉我,我会发布.

class Sudoku {
    int SIZE, N, row, col;
    int Grid[][];    

    public boolean solve() {
        if (!this.findNextZero()) return true;

        for (int num = 1; num <= 9; num++) {
            if (isSafe(num)) {
                this.Grid[this.row][this.col] = num;

                if (this.solve()) return true;

                this.Grid[this.row][this.col] …
Run Code Online (Sandbox Code Playgroud)

java recursion sudoku

8
推荐指数
1
解决办法
4143
查看次数

标签 统计

java ×1

recursion ×1

sudoku ×1