您的位置:首页 > 其它

LeetCode--Sudoku Solver(DFS)

2015-04-01 11:39 225 查看
题意:求解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;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: