解数独-力扣

  • 本题需要进行大量的遍历,一次查找每个为 ’.’ 的元素,然后判断在这个位置插入 ‘1’ 至 ‘9’ 哪个元素有效
  • 有效指 想要插入的元素 在插入位置所在行、所在列、所在九宫格未出现过。 所在行所在列好理解,直接作为参数传入 判断是否有效 函数即可,但所在九宫格就无法直接传入,需要进行单独计算,想到的计算公式为 startRow = row - row % 3;startCol = col - col % 3; 使用所在行列,减去行列对3取余的值,即可得到所在九宫格的起始位置
  • 解数独的正确结果只存在一个,所以backtracking函数的返回值类型可以选择 bool,只要找到一个解就直接返回
  • 每次递归的任务是,在数独中找到一个空格,为这个空格添加一个有效元素,然后进入下一次递归。
class Solution {
public:
    bool isVaild(const vector<vector<char>>& board, int row, int col, char ch){
        for(int i = 0; i < board.size(); i++){
            if(board[i][col] == ch){
                return false;
            }
        }
        for(int j = 0; j < board[row].size(); j++){
            if(board[row][j] == ch){
                return false;
            }
        }

        int startRow = row - row % 3;
        int startCol = col - col % 3;
        for(int i = startRow; i < startRow + 3; i++){
            for(int j = startCol; j < startCol + 3; j++){
                if(board[i][j] == ch){
                    return false;
                }
            }
        }
        return true;
    }
    bool backtracking(vector<vector<char>>& board){
        for(int i = 0; i < board.size(); i++){
            for(int j = 0; j < board[i].size(); j ++){
                if(board[i][j] == '.'){
                    for(char ch = '1'; ch <= '9'; ch++){
                        if(isVaild(board, i, j, ch)){
                            board[i][j] = ch;
                            if(backtracking(board)){
                                return true;
                            }
                            board[i][j] = '.';
                        }
                    }
                    return false;                   
                }
            }
        }
        return true;
    }
    void solveSudoku(vector<vector<char>>& board) {
        backtracking(board);
    }
};
  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值