【问题标题】:Backtracking all answers回溯所有答案
【发布时间】:2015-07-19 13:48:19
【问题描述】:

我这里有这段代码。当您解决数独问题时,它可以正常工作。

int solveBoard(int board[SIZE][SIZE], int rowPos, int colPos) {
    int newValueToCheck, oldRowPos, oldColPos;
    if (rowPos == SIZE) return 1;
    if (board[rowPos][colPos] != 0) {
        if (colPos == SIZE - 1) {
            rowPos++;
            colPos = 0;
        } else colPos++;
        if (solveBoard(board, rowPos, colPos) == 1) return 1;
        return 0;
    } for (newValueToCheck = 1; newValueToCheck <= SIZE; newValueToCheck++)
        if (checkBoard(board, newValueToCheck, rowPos, colPos) == 1) {
            board[rowPos][colPos] = newValueToCheck;
            oldRowPos = rowPos; 
            oldColPos = colPos;
            if (colPos == SIZE - 1) {
                rowPos++;
                colPos = 0;
            } else colPos++;
            if (solveBoard(board, rowPos, colPos) == 1) return 1;
            rowPos = oldRowPos;
            colPos = oldColPos;
            board[rowPos][colPos] = 0;
        }
    return 0;
}

唯一的问题是,我想得到所有可能的答案。我将如何修改它并获得所有可能的答案。

【问题讨论】:

    标签: c recursion sudoku backtracking


    【解决方案1】:

    找到解决方案后不要回溯搜索。所以,在你尝试新值的地方进行一个简单的递归调用并忽略它的返回值:

    solveBoard(board, rowPos, colPos);
    

    然后是递归尾部的每个解决方案:

    if (rowPos == SIZE) printSolution(); return 1;
    

    【讨论】:

    • 我认为您应该删除 return1; 以便您仍然可以打印下一个。
    • 谢谢您的回答
    猜你喜欢
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多