class Solution {
bool backTracking(vector<vector<char>>& board) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] != '.') {
continue;
}
for (char k = '1'; k <= '9'; k++) {
if (isValid(i , j, k, board)) {
board[i][j] = k;
if (backTracking(board)) return true;
board[i][j] = '.';
}
}
return false;
}
}
return true;
}
bool isValid(int row, int col, char var, vector<vector<char>>& board) {
//不能和这一列的数字相同
for (int i = 0; i < 9; i++) {
if (board[row][i] == var) {
return false;
}
}
//不能同一行
for (int i = 0; i < 9; i++) {
if (board[i][col] == var) {
return false;
}
}
//九宫格里面不能有重复数字
int startRow = (row / 3) * 3;
int startCol = (col / 3) * 3;
for (int i = startRow; i < startRow + 3; i++) {
for (int j = startCol; j < startCol + 3; j++) {
if (board[i][j] == var) {
return false;
}
}
}
return true;
}
public:
void solveSudoku(vector<vector<char>>& board) {
backTracking(board);
}
};
回溯-棋盘问题
算法思想:首先看到这题第一想法就是穷举,但是很明显普通的穷举是无法求出答案的,所以利用回溯的方法,其实这题和n皇后问题很像,但是n皇后是每行只能放一个,而数独要放多个,这时候就想到需要用双重for循环来找到节点,然后n叉树的每一层是对该节点赋值,从1-9选择,所以n叉树中n为9。