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