• leetcode 37. 解数独 (困难)



    作者简介:C/C++ 、Golang 领域耕耘者,创作者
    个人主页:作者主页
    活动地址:CSDN21天学习挑战赛
    题目来源: leetcode官网
    如果感觉博主的文章还不错的话,还请关注➕ 、点赞👍 、收藏🧡三连支持一下博主哦~~~

    💜 题目描述

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

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

    数字 1-9 在每一行只能出现一次。
    数字 1-9 在每一列只能出现一次。
    数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
    数独部分空格内已填入了数字,空白格用 ‘.’ 表示。

    在这里插入图片描述

    示例1:

    输入:board = [[“5”,“3”,“.”,“.”,“7”,“.”,“.”,“.”,“.”],[“6”,“.”,“.”,“1”,“9”,“5”,“.”,“.”,“.”],[“.”,“9”,“8”,“.”,“.”,“.”,“.”,“6”,“.”],[“8”,“.”,“.”,“.”,“6”,“.”,“.”,“.”,“3”],[“4”,“.”,“.”,“8”,“.”,“3”,“.”,“.”,“1”],[“7”,“.”,“.”,“.”,“2”,“.”,“.”,“.”,“6”],[“.”,“6”,“.”,“.”,“.”,“.”,“2”,“8”,“.”],[“.”,“.”,“.”,“4”,“1”,“9”,“.”,“.”,“5”],[“.”,“.”,“.”,“.”,“8”,“.”,“.”,“7”,“9”]]
    输出:[[“5”,“3”,“4”,“6”,“7”,“8”,“9”,“1”,“2”],[“6”,“7”,“2”,“1”,“9”,“5”,“3”,“4”,“8”],[“1”,“9”,“8”,“3”,“4”,“2”,“5”,“6”,“7”],[“8”,“5”,“9”,“7”,“6”,“1”,“4”,“2”,“3”],[“4”,“2”,“6”,“8”,“5”,“3”,“7”,“9”,“1”],[“7”,“1”,“3”,“9”,“2”,“4”,“8”,“5”,“6”],[“9”,“6”,“1”,“5”,“3”,“7”,“2”,“8”,“4”],[“2”,“8”,“7”,“4”,“1”,“9”,“6”,“3”,“5”],[“3”,“4”,“5”,“2”,“8”,“6”,“1”,“7”,“9”]]
    解释:输入的数独如上图所示,唯一有效的解决方案如下所示:

    在这里插入图片描述

    🧡 算法分析

    直接暴搜, 按照题目给出的条件进行搜索

    💚 代码实现

    class Solution {
    public:
    
        // 第几行哪个数字已经用了
        // 第几列哪个数字已经用了
        // 小方格中指定位置哪一个数字已经用了
        bool row[9][9], col[9][9], cell[3][3][9];
        void solveSudoku(vector<vector<char>>& board) {
            // 暴搜就行了
            memset(row, 0, sizeof row);
            memset(col, 0, sizeof col);
            memset(cell, 0, sizeof cell);
    
            for(int i =0; i < 9; i ++)
                for(int j = 0;j < 9; j ++)
                    if(board[i][j] != '.')
                    {
                        int t = board[i][j] - '1';
                        row[i][t] = col[j][t] = cell[i / 3][j / 3][t] = true;
                    }
            
            dfs(board, 0, 0);
        }
    
        // 这里bool 返回值, 能起到找到一组解后,提前结束
        bool dfs(vector<vector<char>>& board, int x, int y)
        {
            // 直接从(0,0)开始搜索, 搜索到(8, 8)
            if(y == 9) x ++, y = 0;
            if(x == 9) return true;
    
            if(board[x][y] != '.') return dfs(board, x, y + 1);
            
            // 开始填写0-8
            for(int i = 0; i < 9; i ++)
                if(!row[x][i] && !col[y][i] && !cell[x / 3 ][y / 3][i])
                {
                    board[x][y] = '1' + i; // 试一下这个数字行不行, 转化为字符
                    row[x][i] = col[y][i] = cell[x / 3 ][y / 3][i] = true;
                    if(dfs(board, x, y + 1)) return true;
                    // 回复现场
                    board[x][y] = '.';
                    row[x][i] = col[y][i] = cell[x / 3 ][y / 3][i] = false;
                }
            return false;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    执行结果:

    在这里插入图片描述

    💙 时间复杂度分析

    如果觉得对你有帮助的话:
    👍 点赞,你的认可是我创作的动力!
    🧡 收藏,你的青睐是我努力的方向!
    ✏️ 评论,你的意见是我进步的财富!

  • 相关阅读:
    Bun v0.8.0 正式发布,Zig 编写的 JavaScript 运行时
    Java如何使用反射创建动态代理(JDK原生)呢?
    【剑指Offer】14.剪绳子
    关于JavaScript中reduce的使用场景
    光谱图像超分辨率综述
    pgzrun 拼图游戏制作过程详解(3)
    Android采用Scroller实现底部二楼效果
    2022 Gartner RPA魔力象限发布,两家国产厂商入选,超自自动化成重点
    Cadence Allegro PCB设计88问解析(十五) 之 Allegro中如何替换过孔类型
    [源码解析] NVIDIA HugeCTR,GPU版本参数服务器--- (4)
  • 原文地址:https://blog.csdn.net/qq_39486027/article/details/126239674