如何找到部分填充的数独板的所有解决方案

时间:2016-02-22 03:12:01

标签: algorithm sudoku backtracking

我知道如何使用回溯算法为部分填充的数独板获得一个解决方案,但我不知道如果主板有多个解决方案,如何获得所有解决方案。有算法吗?

以下是我尝试生成所有解决方案的代码示例,但它反复生成相同的解决方案,我不确定问题是什么。

boolean solve(Stack<Integer> emptyLocationList) { 
    if(emptyLocationList.size()==0) return false;
    int emptyId = emptyLocationList.peek();
    int row = emptyId/9, col = emptyId%9;

    for(int val=1; val<=9; val++) {
        if(isSafe(board, row, col, val)) {
            // set value
            board[row][col] = val;
            emptyLocationList.pop();

            // move forward
            if(solve(emptyLocationList)) return true;

            // backtrack
            board[row][col] = 0; 
            emptyLocationList.push(emptyId);
        }
    }
    return false;
}

说明:

  • emptyLocationList:原始部分填充板的空白点堆栈
  • isSafe(board,row,col,val):将val放在(row, col) board
  • 是否安全

当我将if(emptyLocationList.size()==0) return false;更改为if(emptyLocationList.size()==0) return true;时,它会成功生成一个解决方案。

0 个答案:

没有答案