回溯法
class Solution {
private:
vector<vector<bool>> rowCheck;//rowCheck[i][j]表示数字j+1是否在第i行出现(行数从0开始)
vector<vector<bool>> colCheck;//colCheck[i][j]表示数字j+1是否在第i列出现
vector<vector<bool>> blockCheck;//blockCheck[i][j]表示数字j+1是否在第i个宫内出现
bool dfs(vector<vector<char>>& board){
int row=-1,col=-1;
//先找空格子
for(int i=0;i<9;++i)
for(int j=0;j<9;++j)
if(board[i][j]=='.'){
row=i;
col=j;
goto OK;
}
OK:
//如果没有空格子了,就表示找到了一种解法
if(row==-1)
return true;
else{
//从1到9选择一个填到空格子中
for(int i=1;i<=9;++i){
//如果在该行、该列、该宫内已经有了该数,则换下一个数试一下
if(rowCheck[row][i-1] || colCheck[col][i-1] || blockCheck[3*(row/3)+col/3][i-1])
continue;
else{
//找到合适的数,就先试着填进去,并改变相应数组
board[row][col]=i+'0';
rowCheck[row][i-1]=true;
colCheck[col][i-1]=true;
blockCheck[3*(row/3)+col/3][i-1]=true;
//开始填下一个空格子
if(dfs(board))
return true;
//如果下一个空格子返回值是false,那就回溯,再选新的值再填
board[row][col]='.';
rowCheck[row][i-1]=false;
colCheck[col][i-1]=false;
blockCheck[3*(row/3)+col/3][i-1]=false;
}
}
//所有值都选了,没有合适的
return false;
}
}
public:
void solveSudoku(vector<vector<char>>& board) {
rowCheck=vector<vector<bool>>(9,vector<bool>(9,false));
colCheck=vector<vector<bool>>(9,vector<bool>(9,false));
blockCheck=vector<vector<bool>>(9,vector<bool>(9,false));
for(int i=0;i<9;++i)
for(int j=0;j<9;++j)
if(board[i][j]!='.'){
rowCheck[i][board[i][j]-'1']=true;
colCheck[j][board[i][j]-'1']=true;
blockCheck[3*(i/3)+j/3][board[i][j]-'1']=true;
}
dfs(board);
}
};