package class28; public class Problem_0037_SudokuSolver { public static void solveSudoku(char[][] board) { boolean[][] row = new boolean[9][10]; boolean[][] col = new boolean[9][10]; boolean[][] bucket = new boolean[9][10]; initMaps(board, row, col, bucket); process(board, 0, 0, row, col, bucket); } public static void initMaps(char[][] board, boolean[][] row, boolean[][] col, boolean[][] bucket) { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { int bid = 3 * (i / 3) + (j / 3); if (board[i][j] != '.') { int num = board[i][j] - '0'; row[i][num] = true; col[j][num] = true; bucket[bid][num] = true; } } } } // 当前来到(i,j)这个位置,如果已经有数字,跳到下一个位置上 // 如果没有数字,尝试1~9,不能和row、col、bucket冲突 public static boolean process(char[][] board, int i, int j, boolean[][] row, boolean[][] col, boolean[][] bucket) { if (i == 9) { return true; } // 当离开(i,j),应该去哪?(nexti, nextj) int nexti = j != 8 ? i : i + 1; int nextj = j != 8 ? j + 1 : 0; if (board[i][j] != '.') { return process(board, nexti, nextj, row, col, bucket); } else { // 可以尝试1~9 int bid = 3 * (i / 3) + (j / 3); for (int num = 1; num <= 9; num++) { // 尝试每一个数字1~9 if ((!row[i][num]) && (!col[j][num]) && (!bucket[bid][num])) { // 可以尝试num row[i][num] = true; col[j][num] = true; bucket[bid][num] = true; board[i][j] = (char) (num + '0'); if (process(board, nexti, nextj, row, col, bucket)) { return true; } row[i][num] = false; col[j][num] = false; bucket[bid][num] = false; board[i][j] = '.'; } } return false; } } }