YunheWang0813
9/23/2019 - 7:57 PM

0037. Sudoku Solver

class Solution {
public:
    void solveSudoku(vector<vector<char>>& board) {
        if (board.empty() || board.size() == 0) return;
        solve(board);
    }
    bool solve(vector<vector<char>>& board) {
        for (int i = 0; i < board.size(); i++) {
            for (int j = 0; j < board[0].size(); j++) {
                if (board[i][j] == '.') {
                    for (char c = '1'; c <= '9'; c++) {
                        if (is_valid(board, i, j, c)) {
                            board[i][j] = c;
                            if (solve(board)) return true;
                            else board[i][j] = '.';
                        }
                    }
                    return false;
                }
            }
        }
        return true;
    }
    bool is_valid(vector<vector<char>>& board, int& row, int& col, char& c) {
        for (int i = 0; i < 9; i++) {
            int regionRow = 3 * (row / 3);   // region row定位
            int regionCol = 3 * (col / 3);   // region col定位
            if (board[i][col] == c) return false;   // 检查row
            if (board[row][i] == c) return false;   // 检查col
            if (board[3 * (row / 3) + i / 3][3 * (col / 3) + i % 3] == c) return false;   // 检查3*3方块
        }
        return true;
    }
};

题目

https://leetcode.com/problems/sudoku-solver/

算法

用什么:Backtracking

为什么:一个一个尝试所有解法

解题

思路:

  1. 查空后另开一个函数为了backtracking
  2. 二重循环,if('.')就把开始在1~9间backtrack,数字插入当前的表中,检查有没有重复出现,如没有就return true,继续直到循环结束

复杂度

不知道

相似的题

36, 51