LeetCode 37. Sudoku Solver

来源:互联网 发布:mac os x10.10.5 编辑:程序博客网 时间:2024/06/05 15:16

题意

将一个数独填数填充完整

思路

DFS进行暴力搜索,中间进行行、列、块的检查,只是给定的不完整数独可能会有多个答案,使用普通的DFS能够寻找到第一个符合条件的数独,但是并不能AC,所以说采用下面代码的方式进行寻找

代码

class Solution {public:    void solveSudoku(vector<vector<char>>& board) {        findAns(board, 0);    }private:    bool findAns(vector<vector<char>>& board, int id){        if(id == 81){            return true;        }        int c = id % 9, r = id / 9;        if(board[r][c] != '.') return findAns(board, id + 1);        for(int i = 1; i <= 9; i++){            if(check(board, c, r, i + '0')){                board[r][c] = i + '0';                if(findAns(board, id + 1)) return true;                board[r][c] = '.';            }        }        return false;    }    bool check(vector<vector<char>>& board, int c, int r, char val){        for(int i = 0; i < 9; i++){            if(board[r][i] == val){                return false;            }        }        for(int i = 0; i < 9; i++){            if(board[i][c] == val){                return false;            }        }        int sr = r / 3, sc = c / 3;        for(int i = sr * 3; i < sr * 3 + 3;i++){            for(int j = sc * 3; j < sc * 3 + 3; j++){                if(board[i][j] == val){                    return false;                }            }        }        return true;    }};