思路:(借助网上的讨论)因为题目输入保证有且只有一个解,所以试探每一个格子的时候,只需要考虑当前行、列、矩形框满足条件,满足就进入下一个格子试探,不满足回溯。
注意判断一个格子落入哪个矩形框的设计,前面一题采用了比较trivial的方法!-_-
code:
class Solution {
public:
bool isValidSudoku(vector<vector<char> > &board,int row,int col){
for(int j=0;j<9;j++)
if(j != col && board[row][j] == board[row][col])
return false;
for(int i=0;i<9;i++)
if(i != row && board[i][col] == board[row][col])
return false;
int gridRow = row/3*3, gridCol = col/3*3;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
if(gridRow + i != row && gridCol + j != col && board[gridRow + i][gridCol + j] == board[row][col])
return false;
return true;
}
bool solveSudokuSingle(vector<vector<char> > &board){
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
if(board[i][j] == '.'){
for(int k=1;k<=9;k++){
board[i][j] = '0' + k;
if(isValidSudoku(board,i,j) && solveSudokuSingle(board))
return true;
board[i][j] = '.';
}
return false;
}
return true;
}
void solveSudoku(vector<vector<char> > &board) {
solveSudokuSingle(board);
}
};
本文探讨了如何通过回溯法解决数独谜题,确保每一行、每一列和每个九宫格内数字唯一。代码实现中,重点在于有效判断数独单元格是否符合规则,并使用递归函数解决数独谜题。通过实例演示,读者可以深入理解数独求解的核心算法和代码实现细节。
348

被折叠的 条评论
为什么被折叠?



