思路:写两个子函数,一个是检测在9*9的宫格中添加一个数后,是否该宫格为有效的数独。另一个函数是给空格中的空白处添加数字,并利用第一个函数检测添加后是否为有效的数独。
class Solution {
public:
void solveSudoku(vector<vector<char>>& board) {
solvesudokuDFS(board,0,0);
}
bool solvesudokuDFS(vector<vector<char> >&board,int i,int j)
{
if(i==9) return true;
if(j>=9) return solvesudokuDFS(board,i+1,0);
if(board[i][j]=='.')
{
for( int k=1;k<=9;++k)
{
board[i][j]=(char)k+'0';
if(isvalid(board,i,j))
{
if(solvesudokuDFS(board,i,j+1)) return true;
}
board[i][j]='.';
}
}
else
{
return solvesudokuDFS(board,i,j+1);
}
return false;
}
bool isvalid (vector<vector<char> >&board,int i,int j)
{
for(int col=0;col<9;++col)
{
if(col!=j&&board[i][j]==board[i][col]) return false;
}
for(int row=0;row<9;++row)
{
if(row!=i&&board[i][j]==board[row][j]) return false;
}
for(int l=i/3*3;l<i/3*3+3;++l)
for(int m=j/3*3;m<j/3*3+3;++m)
{
if(l!=i&&m!=j&&board[i][j]==board[l][m]) return false;
}
return true;
}
};