题意:求解9*9数独。
题解:典型的DFS,使用三个hash数组来判断行,列以及方块的取值情况,根据深搜不断更新数组。
代码如下:
class Solution {
public:
int solve(vector<vector<char> >& board,int r,int c){
if(r == 8&&c == 9)
//数独完成
return 1;
if(c == 9){
//进入下一行
return solve(board,r+1,0);
}
if(board[r][c] != '.'){
return solve(board,r,c+1);
}
int tmp = r-r%3+c/3;
//方块的序列号
for(int i = 1;i <= 9;i++){
if(row[r][i]||col[c][i]||squ[tmp][i])
continue;
board[r][c] = i+'0';
row[r][i] = col[c][i] = squ[tmp][i] = 1;
if(solve(board,r,c+1)){
return 1;
}
row[r][i] = col[c][i] = squ[tmp][i] = 0;
}
board[r][c] = '.';
return 0;
}
int initHash(vector<vector<char> > &board){
for(int i = 0;i < 9;i ++){
for(int j = 0;j < 9;j++){
if(board[i][j] == '.')
continue;
int tmp = board[i][j]-'0';
row[i][tmp] = 1;
col[j][tmp] = 1;
squ[i-i%3+j/3][tmp] = 1;
}
}
return 0;
}
void solveSudoku(vector<vector<char> > &board) {
vector<vector<bool> >(9,vector<bool>(10,0)).swap(row);
vector<vector<bool> >(9,vector<bool>(10,0)).swap(col);
vector<vector<bool> >(9,vector<bool>(10,0)).swap(squ);
initHash(board);
solve(board,0,0);
}
private:
vector<vector<bool> > row;
vector<vector<bool> > col;
vector<vector<bool> > squ;
};