class Solution {
public:
int flip(int i){
int ret = 1 << i;
ret = ~ret;
return ret;
}
bool valid(int v, int x, int y, vector<int>&row, vector<int>&column, vector<int>&square){
int rowmark = row[x] & (1 << v);
int columnmark = column[y] & (1 << v);
int id1 = x / 3, id2 = y / 3;
int sid = id1 * 3 + id2;
int squaremark = square[sid] & (1 << v);
return rowmark == 0 && columnmark == 0 && squaremark == 0;
}
bool dfs(int x, int y, vector<int>&row, vector<int>&column, vector<int>&square, vector<vector<char> >&board){
bool tmp = false;
if(board[x][y] != '.'){
if(y == 8){
if(x == 8){
return true;
}
else{
tmp = dfs(x + 1, 0, row, column, square, board);
}
}
else{
tmp = dfs(x, y + 1, row, column, square, board);
}
return tmp;
}
for(int i = 1; i <= 9; ++i){
if(valid(i, x, y, row, column, square)){
row[x] |= (1 << i);
column[y] |= (1 << i);
int id1 = x / 3, id2 = y / 3;
int sid = id1 * 3 + id2;
square[sid] |= (1 << i);
board[x][y] = i + '0';
if(y == 8){
if(x == 8){
return true;
}
else{
tmp = dfs(x + 1, 0, row, column, square, board);
}
}
else{
tmp = dfs(x, y + 1, row, column, square, board);
}
if(!tmp){
row[x] &= flip(i);
column[y] &= flip(i);
square[sid] &= flip(i);
board[x][y] = '.';
}
if(tmp){
return true;
}
}
}
return false;
}
void solveSudoku(vector<vector<char> > &board) {
vector<int> row, column, square;
row.resize(9, 0);
column.resize(9, 0);
square.resize(9, 0);
for(int i = 0; i < 9; ++i){
for(int j = 0; j < 9; ++j){
int id1 = i / 3, id2 = j / 3;
int sid = id1 * 3 + id2;
switch(board[i][j]){
case('.'):
break;
default:
int v = board[i][j] - '0';
row[i] |= (1 << v);
column[j] |= (1 << v);
square[sid] |= (1 << v);
break;
}
}
}
dfs(0, 0, row, column, square, board);
}
};