# 37.sudoku Solver 解数独


## 题目描述
链接：[37.Sodoku Solver](https://leetcode.com/problems/sudoku-solver/)

## 解题思路
相比一般的回溯，需要两层for循环，一个处理行，一个处理列，递归的过程来决定，空格处到底填哪个数字；
本递归函数用`bool`作为返回值类型，要注意返回值在递归中的作用；
另外还有一个判断board是否合规的函数。

## 代码
```cpp
class Solution {
  private:
    bool isValid(int row, int col, char val, vector<vector<char>> &board) {
        for (int i = 0; i < 9; i++) { // 判断行里是否重复
            if (board[row][i] == val) {
                return false;
            }
        }
        for (int j = 0; j < 9; j++) { // 判断列里是否重复
            if (board[j][col] == val) {
                return false;
            }
        }
        int startRow = (row / 3) * 3;
        int startCol = (col / 3) * 3;
        for (int i = startRow; i < startRow + 3; i++) { // 判断9方格里是否重复
            for (int j = startCol; j < startCol + 3; j++) {
                if (board[i][j] == val) {
                    return false;
                }
            }
        }
        return true;
    }
    bool track_back(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 (track_back(board))
                            return true;
                        board[i][j] = '.';
                    }
                }
                return false;
            }
        }
        return true;
    }

  public:
    void solveSudoku(vector<vector<char>> &board) {
        track_back(board);
    }
};
```

