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