代码如下(示例):
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条)