【回溯】【leetcode】解数独

本文介绍了解数独问题的解决方法,主要通过回溯算法,详细讲解了如何利用递归和候选数集来填充数独空格。通过实例展示了`Solution`类中`solveSudoku`、`back`和`check`函数的工作原理。
摘要由CSDN通过智能技术生成

题目:

解数独

来源:

37. 解数独

解题思路:回溯

先找出所有的空位置,依次选择每个空位置,根据行、列、当前单元格,选择候选数字集合。针对集合中的每个数字递归+回溯。

  • 递归终止条件:所有的空位置填充完毕

此处函数带有bool返回值,便于直接返回。没找到解之前递归每个数字+回溯,一旦找出解,即刻返回,不能再回溯。如果再回溯,填充的位置将被清空。

class Solution {
public:
    void solveSudoku(vector<vector<char>>& board) {
        vector<int> space;
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (board[i][j] == '.') {
                    space.push_back(i * 10 + j);
                }
            }
        }
        back(board, space, 0);
    }
    bool back(vector<vector<char>>& board, const vector<int>& space, int start) {
        if (start == space.size()) {
            return true;
        }
        int t = space[start];
        int x = t / 10; // x行
        int y = t % 10; // y列
        for (int i = 0; i < 9; i++) {
            char v = i+1+'0';
            if (check(board, x, y, v)) {
                board[x][y] = v;
                if (back(board, space, start+1)) return true;
                board[x][y] = '.'; // 找到以后不能再回溯,所以函数直接返回不能到达这里
            }
        }
        return false;
    }
    bool check(const vector<vector<char>>& board, int x, int y, char v) {
        // 第x行
        for (int i = 0; i < 9; i++) {
            if (board[x][i] == v) return false;
        }
        // 第y列
        for (int i = 0; i < 9; i++) {
            if (board[i][y] == v) return false;
        }
        // 当前单元格
        int row = x / 3 * 3;
        int col = y / 3 * 3;
        for (int r = row; r < row+3; r++) {
            for (int c = col; c < col+3; c++) {
                if (board[r][c] == v) return false;
            }
        }
        return true;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值