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; } };