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