class Solution {
public:
void solveSudoku(vector<vector<char> >& board) {
backtrack(board);
}
bool backtrack(vector<vector<char>>& board) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] == '.' || board[i][j] == '0') { // 空格
for (char ch = '1'; ch <= '9'; ch++) {
if (isValid(board, i, j, ch)) {
board[i][j] = ch; // 放数字
if (backtrack(board)) return true; // 成功就返回
board[i][j] = '.'; // 回溯
}
}
return false; // 9个数字都不行,返回false
}
}
}
return true; // 没有空格了,说明成功
}
// 检查数字ch放在(i,j)是否合理
bool isValid(vector<vector<char>>& board, int row, int col, char ch) {
for (int k = 0; k < 9; k++) {
if (board[row][k] == ch) return false; // 行
if (board[k][col] == ch) return false; // 列
int r = (row / 3) * 3 + k / 3;
int c = (col / 3) * 3 + k % 3;
if (board[r][c] == ch) return false; // 3x3宫
}
return true;
}
};