
代码如下(示例):
class Solution {
public:
void solveSudoku(vector>& board) {
vector> box;
vector> row;
vector> 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>& board,vector>& box,vector>& row,vector>& 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;
}
};
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)