| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 | 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] = '.';    }}
 |