【算法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);
    }
};
相关推荐
kisshyshy6 小时前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法
猿人谷13 小时前
不只是 CPU 阈值:STAR 如何用 GAT + Transformer 做容器级自动扩缩容?
人工智能·算法
复杂网络14 小时前
Stable Diffusion 视觉大模型微调技术深度调研
算法
复杂网络14 小时前
基于 Stable Diffusion 架构的视觉大模型代表性工作与原理深度解析
算法
MrZhao40014 小时前
Agent Loop 如何用 Hook 扩展:权限、日志与工具拦截
算法
MrZhao40014 小时前
Agent 为什么需要 Skills:别把所有知识都塞进 system prompt
算法
JieE2122 天前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2123 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack203 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树3 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色