0

我正在尝试编写一个数独求解器,它只会返回第一个可能的解决方案。我设法用 void 方法打印了所有可能的解决方案,但我不能在第一次找到时停下来。

我知道首选的方法是切换到布尔方法并返回true树 - 但我找不到正确的方法来编写它。

我尝试的任何方式总是给出编译错误(method must return boolean)。

public boolean recursiveSolve(int line, int column) {
    if(line == N) // N is the board size (9)
        return true;
    // if Cell is not empty - continue
    if(board1.getCell(line, column) != 0) { 
        return nextCell(line, column);
    }
    // if Cell empty - solve
    else { 
        for(int i = 1; i <= N; i++) {
            board1.setCell(line, column, i); // set value to cell
            if(board1.boardIsOk())           // check if the board is legal
                return nextCell(line, column); // continue
        }
        board1.setCell(line, column, 0);     // backtrack
    }
}

private boolean nextCell(int line, int column) {
    if(column < 8)
        return recursiveSolve(line, column+1); // progress up the row
    else
        return recursiveSolve(line+1, 0);      // progress down the lines
}

任何帮助将不胜感激。

4

2 回答 2

9

这是大多数递归回溯问题的一些伪代码。

如果您已经找到解决方案,请报告成功。

for(当前位置的所有可能选择){

做出那个选择,沿着这条路迈出一步。

使用递归从新位置解决问题。

如果递归调用成功,则向上一级报告成功。

退出当前选择以恢复循环开始时的状态。

}

报告失败。

这是一些基于斯坦福讲座的实际代码。我用java重写了它并包含了评论。

Boolean SolveSudoku(int[][] grid)
{
    int row, col;

    if(!FindUnassignedLocation(grid, row, col))
        //all locations successfully assigned
        return true;

    for(int num = 1; num <= 9; num++)
    {
        //if number is allowed to be placed in the square
        if(NoConflicts(grid, row, col, num))
        {
            //place the number in the square
            grid[row][col] = num;

            //recur, if successful then stop
            if(SolveSudoku(grid))
                return true;

            //undo and try again
            grid[row][col] = UNASSIGNED;
        }
     }
     //this triggers backtracking from early decisions
     return false;
}

您只需要实现一些非常简单的方法。

于 2012-01-28T02:04:01.527 回答
0

改变

        if(board1.boardIsOk())           // check if the board is legal
            return nextCell(line, column); // continue

进入

        if(board1.boardIsOk()) {          // check if the board is legal
            boolean solved = nextCell(line, column); // continue
            if (solved) {
                return true;
            ]
        }
    ...
    return false;
于 2012-01-27T22:48:20.187 回答