【算法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);
    }
};
相关推荐
妄想出头的工业炼药师14 分钟前
GS slam mono
算法·开源
_日拱一卒1 小时前
LeetCode:207课程表
java·数据结构·算法·leetcode·职场和发展
用户987409238873 小时前
llamafactory 0.6.3 没有 llamafactory-cli
算法
计算机安禾3 小时前
【算法分析与设计】第26篇:参数化算法与固定参数可解性理论
大数据·人工智能·算法·机器学习·剪枝
AI科技星4 小时前
基于**v=c(空间光速螺旋运动)唯一第一性原理**重新完整求导证明
人工智能·线性代数·算法·机器学习·架构·概率论·学习方法
风筝在晴天搁浅4 小时前
美团 LeetCode 692.前K个高频单词
算法·leetcode·职场和发展
地平线开发者4 小时前
量化训练时 fusebn/withbn 简介
算法·自动驾驶
不做无法实现的梦~5 小时前
MAVLink 协议教程
linux·stm32·嵌入式硬件·算法
墨白曦煜5 小时前
算法实战笔记:剥开回溯算法的外衣——从通用模板到高阶去重(八)
笔记·算法
z200509305 小时前
今日算法(回溯子集)(模版题)
数据结构·算法·leetcode