Write a program to solve a Sudoku puzzle by filling the empty cells.
Empty cells are indicated by the character ‘.’.
You may assume that there will be only one unique solution.
这道题是求解数独。
解题思想:
1.在每个空格中放入试探性的数字,用一个函数来判断其合理性。
2.判断函数实现的功能是判断每一行,每一列,每一个子矩阵是否有重复的数字。
3.采用递归的思想来求解。
class Solution {
public:
void solveSudoku(vector<vector<char>>& board) {
int rows=0;
int cols=0;
bool found=false;
_dosolve(board,rows,cols,found);
}
bool isValidSudoku(vector<vector<char>>& board) {
set<char> temp;
int count=0;
for(int i=0;i<board.size();i++){ //判断每一行
for(int j=0;j<board.size();j++)
if(board[i][j]!='.'){
count++;
temp.insert(board[i][j]);
}
if(temp.size()!=count)
return false;
count=0;
temp.clear();
}
for(int i=0;i<board.size();i++){ //判断每一列
for(int j=0;j<board.size();j++)
if(board[j][i]!='.'){
count++;
temp.insert(board[j][i]);
}
if(temp.size()!=count)
return false;
count=0;
temp.clear();
}
for(int i=0;i<board.size();i++){ //判断每一个3*3的矩阵
for(int j=0;j<board.size();j++)
if(board[i/3*3+j/3][i%3*3+j%3]!='.'){
count++;
temp.insert(board[i/3*3+j/3][i%3*3+j%3]);
}
if(temp.size()!=count)
return false;
count=0;
temp.clear();
}
return true;
}
private:
void _dosolve(vector<vector<char>>& board,int rows,int cols,bool& found){
if(cols==9)
_dosolve(board,rows+1,0,found);
else if(rows==9){
found=true;
return ;
}
else{
if(board[rows][cols]=='.'){
for(int i=1;i<=9;i++){
board[rows][cols]=i+'0';
if(isValidSudoku(board)==true){
_dosolve(board,rows,cols+1,found);
if(found==true)
return;
}
board[rows][cols]='.';
}
}
else
_dosolve(board,rows,cols+1,found);
}
}
};