使用递归进行填入数字,在每行填完之后的可行结果时进行返回true,如果不满足就返回false
代码如下(示例):
class Solution {
public:
void solveSudoku(vector<vector<char>>& board) {
vector<vector<int>> box;
vector<vector<int>> row;
vector<vector<int>> column;
for (int i = 0; i < 9; i++)
{
box.push_back({ 0,0,0,0,0,0,0,0,0 });
row.push_back({ 0,0,0,0,0,0,0,0,0 });
column.push_back({ 0,0,0,0,0,0,0,0,0 });
}
//建立三个数组,用来判断行,列,九宫格里面的已经填入的数字,并标记为1
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
int a=(i/3)*3+j/3;
int b=(i%3)*3+j%3;
if (board[i][j]!='.')
{
int c = int(board[i][j]) - 48;
box[a][c - 1] = 1;
}
if (board[i][j] != '.')
{
int c = int(board[i][j]) - 48;
column[i][c - 1] = 1;
row[j][c-1] = 1;
}
}
}
solver(board,box,row,column);
}
bool solver(vector<vector<char>>& board,vector<vector<int>>& box,vector<vector<int>>& row,vector<vector<int>>& column)
{
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
if(board[i][j]!='.')
{
continue;
}
for(int k=0;k<9;k++)
{
int a=(i/3)*3+j/3;
//判断是否可以插入当前数字K
if(column[i][k]!=1 && row[j][k]!=1 && box[a][k]!=1)
{
column[i][k]=1;
row[j][k]=1;
box[a][k]=1;
char e=k+'1';
board[i][j]=e;
if(solver(board,box,row,column)) return true;//得到满足要求的一组就开始返回
//如果不满足要求,就会执行以下语句,将行、列、九宫格的标记还原为0
board[i][j]='.';
column[i][k]=0;
row[j][k]=0;
box[a][k]=0;
}
}
//k始终都没有插入,返回false,回溯,回到上一步重新插入上一步的k值
return false;
}
}
//循环到最后,返回true
return true;
}
};