解决数独 - 回溯算法不会回溯 - Java

时间:2018-02-14 23:29:33

标签: java algorithm backtracking recursive-backtracking

我花了很多时间考虑一种基于回溯实现Sudoku求解算法的方法。但是,我遇到了一个问题 - 一旦出现错误,算法就不会回溯。为了使事情变得尽可能简单,这是我的主要功能:

public class Sudoku {
    private int[][] grid = new int[9][9];
    private int col;
    private int row;

    public boolean solveSudoku() {
        if(!(this.FindEmptyCell())) {
            return true;
        }

        for(int num = 1; num <= 9; num++) {
            if(this.isPossible(this.col, this.row, num)) {
                this.grid[this.col][this.row] = num;
                if(this.solveSudoku()) {
                    return true;
                }
                this.grid[col][row] = 0;
            }
        }
        return false;
    }
}

Sudoku类的构造函数创建一个空板,然后计算机必须用满足Sudoku规则的数字填充整个网格。
FindEmptyCell方法将字段row和column的值设置为等于第一个未占用单元格的索引。 此网格表示我的程序返回false时的状态:

1 2 3 4 5 6 7 8 9 
4 5 6 1 2 3 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 


请问,请告诉我,到目前为止,我的算法是否正确?如果是这样,那就意味着错误位于辅助功能中的某处。例如,我不知道使用字段来存储索引不会阻止回溯。
任何帮助,将不胜感激。此外,如果这篇文章在某种程度上违反了该委员会的规定,请在downvoting之前的评论中告知我 - 我希望将来避免这些错误。



编辑:提供其余方法:

public Sudoku() {
    for(int i = 0; i < 9; i++) {
        for(int j = 0; j < 9; j++) {
            grid[i][j] = 0;
        }
    }
}

public boolean FindEmptyCell(int col, int row) {
    for(col = 0; col < 9; col++) {
        for(row = 0; row < 9; row++) {
            if(this.grid[col][row] == 0) {
                return true;
            }
        }
    }
    return false;
}

public boolean usedInRow(int row, int num) {
    for(int col = 0; col < 9; col++) {
        if(grid[col][this.row] == num) {
            return true;
        }
    }
    return false;
}

public boolean usedInColumn(int col, int num) {
    for(int row = 0; row < 9; row++) {
        if(grid[this.col][row] == num) {
            return true;
        }
    }
    return false;
}

public boolean usedInBox(int boxStartRow, int boxStartCol, int num) {
    for(int col = 0; col < 3; col++) {
        for(int row = 0; row < 3; row++) {
            if(grid[col+boxStartCol][row + boxStartRow] == num) {
                return true;
            }
        }
    }
    return false;
}

public boolean isPossible(int col, int row, int number) {
    return !(this.usedInRow(this.row, number)) && !this.usedInColumn(this.col, number) && !this.usedInBox(row - row%3, col-col%3, number);
}

0 个答案:

没有答案