这就是一个经典的回溯递归问题,一个格子一个格子的填写,递归到下一层
递归回溯的方法是每一格子1-9逐个填写,因为数读只有唯一解,因此这种搜索的方法一定可以找到答案。
class Solution {
public:
bool flagRow[9][9]; // 第一个下标个代表行号,第二个下标代表该数字是否用过
bool flagCol[9][9]; // 第一个下标代表列号, 第二个下标代表该数字是否用过
bool flagBox[3][3][9];
void solveSudoku(vector<vector<char>>& board) {
memset(flagRow,false,sizeof flagRow);
memset(flagCol,false,sizeof flagCol);
memset(flagBox,false,sizeof flagBox);
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(board[i][j]!='.'){
int k = board[i][j] - '1';
flagRow[i][k] = true;
flagCol[j][k] = true;
flagBox[i/3][j/3][k] = true;
}
}
}
dfs(board,0,0);
}
bool dfs(vector<vector<char>>& board, int x, int y){
cout<<x<<" "<<y<<endl;
if(x==9){
y++;
x=0;
}
if(y==9) return true;
if(board[y][x]!='.') return dfs(board,x+1,y);
for(int i=0;i<9;i++){
if(!flagRow[y][i]&&!flagCol[x][i]&&!flagBox[y/3][x/3][i]){
board[y][x] = '1'+ i;
flagRow[y][i] = true;
flagCol[x][i] = true;
flagBox[y/3][x/3][i] = true;
if(dfs(board,x+1,y)) return true;
board[y][x] = '.';
flagRow[y][i] = false;
flagCol[x][i] = false;
flagBox[y/3][x/3][i] = false;
}
}
return false;
}
};