1import java.util.*;2
3class Solution {4 public void solveSudoku(char[][] board) {5 int[] rows = new int[9], cols = new int[9], boxes = new int[9];6 List<int[]> empty = new ArrayList<>();7 for (int r = 0; r < 9; r++) for (int c = 0; c < 9; c++) {8 if (board[r][c] == '.') empty.add(new int[]{r, c});9 else {10 int bit = 1 << (board[r][c] - '1'), b = (r / 3) * 3 + c / 3;11 rows[r] |= bit; cols[c] |= bit; boxes[b] |= bit;12 }13 }14 search(board, empty, 0, rows, cols, boxes);15 }16 private boolean search(char[][] board, List<int[]> empty, int k,17 int[] rows, int[] cols, int[] boxes) {18 if (k == empty.size()) return true;19 int r = empty.get(k)[0], c = empty.get(k)[1], b = (r / 3) * 3 + c / 3;20 int available = 511 & ~(rows[r] | cols[c] | boxes[b]);21 while (available != 0) {22 int bit = available & -available;23 available ^= bit;24 board[r][c] = (char) ('1' + Integer.numberOfTrailingZeros(bit));25 rows[r] |= bit; cols[c] |= bit; boxes[b] |= bit;26 if (search(board, empty, k + 1, rows, cols, boxes)) return true;27 rows[r] &= ~bit; cols[c] &= ~bit; boxes[b] &= ~bit;28 board[r][c] = '.';29 }30 return false;31 }32}