dengxinyi há 6 anos atrás
pai
commit
ebfe8faa51
1 ficheiros alterados com 59 adições e 0 exclusões
  1. 59 0
      hard/37.sudoku-solver.java

+ 59 - 0
hard/37.sudoku-solver.java

@@ -0,0 +1,59 @@
+class Solution {
+    private char[][] board;
+    private int[] row;
+    private int[] col;
+    private int[] box;
+
+    public void solveSudoku(char[][] board) {
+        this.board = board;
+        row = new int[9];
+        col = new int[9];
+        box = new int[9];
+        for (int i = 0; i < 9; i++) {
+            for (int j = 0; j < 9; j++) {
+                char c;
+                if ((c = board[i][j]) == '.') continue;
+                set(i, j, c - '0');
+            }
+        }
+        dfs(0, 0);
+    }
+
+    private boolean dfs(int y, int x) {
+        for (; y < 9; y++) {
+            for (x = x == 9 ? 0 : x; x < 9; x++) {
+                char c;
+                if ((c = board[y][x]) != '.') continue;
+                int i = 1;
+                for (; i <= 9; i++) {
+                    if (!set(y, x, i)) continue;
+                    if (dfs(y, x)) return true;
+                    unset(y, x);
+                }
+                if (i == 10) return false;
+            }
+        }
+        return true;
+    }
+
+    private boolean set(int y, int x, int val) {
+        int mask = 1 << val;
+        int id = y / 3 * 3 + x / 3;
+        if ((row[y] & mask) != 0 || (col[x] & mask) != 0 || (box[id] & mask) != 0) return false;
+        row[y] |= mask;
+        col[x] |= mask;
+        box[id] |= mask;
+        board[y][x] = (char)(val + '0');
+        return true;
+    }
+
+    private void unset(int y, int x) {
+        int val = board[y][x] - '0';
+        int mask = (0x400 - 1) ^ (1 << val);
+        int id = y / 3 * 3 + x / 3;
+        row[y] &= mask;
+        col[x] &= mask;
+        box[id] &= mask;
+        board[y][x] = '.';
+    }
+}