- 本题需要进行大量的遍历,一次查找每个为 ’.’ 的元素,然后判断在这个位置插入 ‘1’ 至 ‘9’ 哪个元素有效
- 有效指 想要插入的元素 在插入位置所在行、所在列、所在九宫格未出现过。 所在行所在列好理解,直接作为参数传入 判断是否有效 函数即可,但所在九宫格就无法直接传入,需要进行单独计算,想到的计算公式为 startRow = row - row % 3;startCol = col - col % 3; 使用所在行列,减去行列对3取余的值,即可得到所在九宫格的起始位置
- 解数独的正确结果只存在一个,所以backtracking函数的返回值类型可以选择 bool,只要找到一个解就直接返回
- 每次递归的任务是,在数独中找到一个空格,为这个空格添加一个有效元素,然后进入下一次递归。
class Solution {
public:
bool isVaild(const vector<vector<char>>& board, int row, int col, char ch){
for(int i = 0; i < board.size(); i++){
if(board[i][col] == ch){
return false;
}
}
for(int j = 0; j < board[row].size(); j++){
if(board[row][j] == ch){
return false;
}
}
int startRow = row - row % 3;
int startCol = col - col % 3;
for(int i = startRow; i < startRow + 3; i++){
for(int j = startCol; j < startCol + 3; j++){
if(board[i][j] == ch){
return false;
}
}
}
return true;
}
bool backtracking(vector<vector<char>>& board){
for(int i = 0; i < board.size(); i++){
for(int j = 0; j < board[i].size(); j ++){
if(board[i][j] == '.'){
for(char ch = '1'; ch <= '9'; ch++){
if(isVaild(board, i, j, ch)){
board[i][j] = ch;
if(backtracking(board)){
return true;
}
board[i][j] = '.';
}
}
return false;
}
}
}
return true;
}
void solveSudoku(vector<vector<char>>& board) {
backtracking(board);
}
};