1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| public class SudokuLeetcode37 { record Pair(int i, int j) {
}
static void solveSudoku(char[][] table) { int n = 9; boolean[][] va = new boolean[n][n]; boolean[][] vb = new boolean[n][n]; boolean[][][] vc = new boolean[3][3][n]; List<Pair> blanks = new ArrayList<>(); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (table[i][j] != '.') { int x = table[i][j] - '0' - 1; va[i][x] = true; vb[j][x] = true; vc[i / 3][j / 3][x] = true; } else { blanks.add(new Pair(i, j)); } } } dfs(0, blanks, table, va, vb, vc); }
static boolean dfs(int p, List<Pair> blanks, char[][] table, boolean[][] va, boolean[][] vb, boolean[][][] vc) { if (p == blanks.size()) { print(table); return true; } int n = table.length; for (int d = 0; d < n; d++) { Pair pair = blanks.get(p); if (va[pair.i][d] || vb[pair.j][d] || vc[pair.i / 3][pair.j / 3][d]) { continue; } char ch = (char) (d + '0' + 1); table[pair.i][pair.j] = ch; va[pair.i][d] = true; vb[pair.j][d] = true; vc[pair.i / 3][pair.j / 3][d] = true; boolean dfs = dfs(p + 1, blanks, table, va, vb, vc); if (dfs) { return true; } table[pair.i][pair.j] = '.'; va[pair.i][d] = false; vb[pair.j][d] = false; vc[pair.i / 3][pair.j / 3][d] = false;
} return false; }
public static void main(String[] args) { char[][] table = { {'5', '3', '.', '.', '7', '.', '.', '.', '.'}, {'6', '.', '.', '1', '9', '5', '.', '.', '.'}, {'.', '9', '8', '.', '.', '.', '.', '6', '.'}, {'8', '.', '.', '.', '6', '.', '.', '.', '3'}, {'4', '.', '.', '8', '.', '3', '.', '.', '1'}, {'7', '.', '.', '.', '2', '.', '.', '.', '6'}, {'.', '6', '.', '.', '.', '.', '2', '8', '.'}, {'.', '.', '.', '4', '1', '9', '.', '.', '5'}, {'.', '.', '.', '.', '8', '.', '.', '7', '9'} };
solveSudoku(table);
print(table); }
static char[][] solved = { {'5', '3', '4', '6', '7', '8', '9', '1', '2'}, {'6', '7', '2', '1', '9', '5', '3', '4', '8'}, {'1', '9', '8', '3', '4', '2', '5', '6', '7'}, {'8', '5', '9', '7', '6', '1', '4', '2', '3'}, {'4', '2', '6', '8', '5', '3', '7', '9', '1'}, {'7', '1', '3', '9', '2', '4', '8', '5', '6'}, {'9', '6', '1', '5', '3', '7', '2', '8', '4'}, {'2', '8', '7', '4', '1', '9', '6', '3', '5'}, {'3', '4', '5', '2', '8', '6', '1', '7', '9'} };
static void print(char[][] table) { for (char[] chars : table) { System.out.println(new String(chars)); } System.out.println(Arrays.deepEquals(table, solved)); } }
|