class Solution {
public:
int getValidMove(const vector<vector<char> >&board, int r, int c) {
assert(board[r][c] == '.');
int s = 0;
//row
for (int j = 0; j < 9; ++j) {
if (board[r][j] != '.') {
int k = (1 << (board[r][j] - '1'));
s |= k;
}
}
//colum
for (int i = 0; i < 9; ++i) {
if (board[i][c] != '.') {
int k = (1 << (board[i][c] - '1'));
s |= k;
}
}
//cell
r = r / 3 * 3;
c = c / 3 * 3;
for (int i = 0; i < 9; ++i) {
int nr = r + i / 3;
int nc = c + i % 3;
if (board[nr][nc] != '.') {
int k = (1 << (board[nr][nc] - '1'));
s |= k;
}
}
return ((1<<9) - 1) ^ s;
}
bool solve(vector<vector<char> >&board, int pos) {
if (pos >= 81) {
return true;
}
int r = pos / 9, c = pos % 9;
if (board[r][c] != '.') {
return solve(board, pos + 1);
} else {
int s = getValidMove(board, r, c);
for (int i = 0; i < 9; ++i) {
if (s & (1 << i)) {
board[r][c] = char('1' + i);
if (solve(board, pos + 1)) {
return true;
}
}
}
board[r][c] = '.';
return false;
}
return false;
}
void solveSudoku(vector<vector<char>>& board) {
solve(board, 0);
}
};