【算法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);
    }
};
相关推荐
三维重建-光栅投影30 分钟前
VS中将cuda项目编译为DLL并调用
算法
课堂剪切板3 小时前
ch03 部分题目思路
算法
山登绝顶我为峰 3(^v^)34 小时前
如何录制带备注的演示文稿(LaTex Beamer + Pympress)
c++·线性代数·算法·计算机·密码学·音视频·latex
Two_brushes.5 小时前
【算法】宽度优先遍历BFS
算法·leetcode·哈希算法·宽度优先
森焱森7 小时前
水下航行器外形分类详解
c语言·单片机·算法·架构·无人机
QuantumStack9 小时前
【C++ 真题】P1104 生日
开发语言·c++·算法
写个博客9 小时前
暑假算法日记第一天
算法
绿皮的猪猪侠9 小时前
算法笔记上机训练实战指南刷题
笔记·算法·pta·上机·浙大
hie9889410 小时前
MATLAB锂离子电池伪二维(P2D)模型实现
人工智能·算法·matlab
杰克尼10 小时前
BM5 合并k个已排序的链表
数据结构·算法·链表