解法一:use three extra 2D vectors
class Solution {
public:
bool helper(vector<vector<char>>& board, vector<vector<bool>>& row, vector<vector<bool>>& col, vector<vector<bool>>& block, int i, int j){
if(i==9) return true;
if(j==9) return helper(board, row, col, block, i+1, 0);
if(board[i][j]=='.'){
for(int k=0;k<9;k++){
if((!row[i][k]) && (!col[j][k]) && (!block[i/3*3+j/3][k])){
row[i][k] = true;
col[j][k] = true;
block[i/3*3+j/3][k] = true;
board[i][j] = (char) (k+'1');
if(helper(board, row, col, block, i, j+1)) return true;
board[i][j] ='.';
row[i][k] = false;
col[j][k] = false;
block[i/3*3+j/3][k] = false;
}
}
}else{
return helper(board, row, col, block, i, j+1);
}
return false;
}
void solveSudoku(vector<vector<char>>& board) {
int n = board.size();
vector<vector<bool>> row(n, vector<bool>(n,false));
vector<vector<bool>> col(n, vector<bool>(n,false));
vector<vector<bool>> block(n, vector<bool>(n,false));
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(board[i][j]!='.'){
int k = board[i][j]-'1';
row[i][k] = true;
col[j][k] = true;
block[i/3*3+j/3][k] = true;
}
}
}
helper(board, row, col, block, 0, 0);
}
};
Notes:
1. between number and char, 'any number'-'0' = that number
2.block[i/3*3+j/3][k]