该算法使用回溯+递归的方法求出一个数独的所有可能解。
import java.util.Arrays;
public class Sudoku {
private static int count = 0;
public static void solveSudoku(char[][] board,int row, int col) {
if (row == 9) { //当 row 遍历到9时,说明0-8行的数独矩阵已填充完毕,该解法成立,将其输出
System.out.println("Solution " + ++count + ":");
for (char[] chars : board) {
System.out.println(Arrays.toString(chars));
}
System.out.println();
} else {
if (board[row][col] != '.') { //当该元素是数字时,填充下一个元素
solveSudoku(board, row + (col + 1) / 9, (col + 1) % 9);
} else {
for (char i = '1'; i <= '9'; i++) { //该元素不为数字时,将1-9依次填入,判断是否可行
if (canFill(board, row, col, i)) {
board[row][col] = i;
solveSudoku(board, row + (col + 1) / 9, (col + 1) % 9);
}
}
board[row][col] = '.';
}
}
}
public static boolean canFill(char[][] board, int row, int col, char num) { //该方法用于判断 num 是否能填入 row 行 col 列
for (int j = 0; j < 9; j++) { //判断该行是否存在 num
if (j == col) continue;
if (num == board[row][j]) return false;
}
for (int i = 0; i < 9; i++) { //判断该列是否存在 num
if (i == row) continue;
if (num == board[i][col]) return false;
}
for (int i = row / 3 * 3; i < row / 3 * 3 + 3; i++) { //判断该九宫内是否存在 num
for (int j = col / 3 * 3; j < col / 3 * 3 + 3; j++) {
if (i == row && j == col) continue;
if (num == board[i][j]) return false;
}
}
return true;
}
public static void main(String[] args) {
char[][] board = {{'.','4','.','.','.','.','1','.','.'},
{'.','.','8','.','5','.','.','.','.'},
{'.','.','6','.','.','9','.','.','.'},
{'.','5','.','.','.','8','.','6','3'},
{'.','.','.','5','7','.','.','8','.'},
{'2','.','.','9','.','.','.','.','.'},
{'3','.','7','.','.','.','4','.','.'},
{'.','.','.','4','.','7','.','9','.'},
{'.','.','.','8','6','.','.','5','.'}};
solveSudoku(board, 0, 0);
}
}