【算法day28】解数独——编写一个程序,通过填充空格来解决数独问题

37. 解数独

编写一个程序,通过填充空格来解决数独问题。

数独的解法需 遵循如下规则:

数字 1-9 在每一行只能出现一次。

数字 1-9 在每一列只能出现一次。

数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

数独部分空格内已填入了数字,空白格用 '.' 表示。

https://leetcode.cn/problems/sudoku-solver/submissions/618100739/

cpp 复制代码
class Solution {
public:
    bool rows[9][9];
    bool cols[9][9];
    bool cubes[9][9];

    vector<pair<int, int>> blanks; // 存储blanks空白的格子
    bool valid = false;

    void dfs(vector<vector<char>>& board, int pos) {
        if (blanks.size() == pos) {
            valid = true;
            return;
        }
        auto [i, j] = blanks[pos];
        for (int num = 0; num < 9 && !valid; ++num) {
            if (!rows[i][num] && !cols[j][num] && !cubes[((int)(i / 3)) * 3 + (j / 3)][num]) {
                rows[i][num] = 1;
                cols[j][num] = 1;
                cubes[((int)(i / 3)) * 3 + (j / 3)][num] = 1;
                board[i][j] = num + '0' + 1;
                dfs(board, pos + 1);
                // 如果没有成功,那么返回
                rows[i][num] = 0;
                cols[j][num] = 0;
                cubes[((int)(i / 3)) * 3 + (j / 3)][num] = 0;
            }
        }
        return;
    }
    void solveSudoku(vector<vector<char>>& board) {
        memset(rows, false, sizeof(rows));
        memset(cols, false, sizeof(cols));
        memset(cubes, false, sizeof(cubes));
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (board[i][j] != '.') {
                    int cur_num = board[i][j] - '1';
                    rows[i][cur_num] = 1;
                    cols[j][cur_num] = 1;
                    // cube要算一下是第几个cube
                    cubes[((int)(i / 3)) * 3 + (j / 3)][cur_num] = 1;
                } else {
                    // i,j空白了
                    blanks.emplace_back(i, j);
                }
            }
        }
        dfs(board,0);
    }
};
相关推荐
计信金边罗39 分钟前
是否存在路径(FIFOBB算法)
算法·蓝桥杯·图论
MZWeiei44 分钟前
KMP 算法中 next 数组的构建函数 get_next
算法·kmp
Fanxt_Ja2 小时前
【JVM】三色标记法原理
java·开发语言·jvm·算法
luofeiju2 小时前
行列式的性质
线性代数·算法·矩阵
緈福的街口2 小时前
【leetcode】347. 前k个高频元素
算法·leetcode·职场和发展
pen-ai3 小时前
【统计方法】基础分类器: logistic, knn, svm, lda
算法·机器学习·支持向量机
鑫鑫向栄3 小时前
[蓝桥杯]春晚魔术【算法赛】
算法·职场和发展·蓝桥杯
roman_日积跬步-终至千里3 小时前
【Go语言基础【3】】变量、常量、值类型与引用类型
开发语言·算法·golang
FrankHuang8884 小时前
使用高斯朴素贝叶斯算法对鸢尾花数据集进行分类
算法·机器学习·ai·分类
菠萝014 小时前
共识算法Raft系列(1)——什么是Raft?
c++·后端·算法·区块链·共识算法