当前位置: 首页 > news >正文

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

37. 解数独

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

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

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

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

在这里插入图片描述

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);
    }
};

相关文章:

  • 聊一聊,元件封装知多少?
  • 数据结构C语言练习(两个栈实现队列)
  • go游戏后端开发19:创建房间
  • 机器人基础知识-2
  • 万字知识篇(2):SpringBoot的常用注解(上)
  • C++学习笔记(三十三)——forward_list
  • zk基础—2.架构原理和使用场景二
  • 数字图像处理实验报告7-图像压缩编码
  • Python 责任链模式
  • 蓝桥云客 2022
  • 坚持的力量与智慧策略
  • cv2.fillPoly()和cv2.polylines()
  • 【分布式】Hystrix 的核心概念与工作原理​
  • Java的设计模式详解
  • 【数论4】求解线性同余方程和方程组
  • FPGA | 等精度测频应用与实践
  • RSTP --- 快速生成树
  • 如何成功点亮LED灯并实现闪烁效果
  • ROS软路由多wifi多IP搭建一览表
  • 红黑树剖析
  • 中山精品网站建设渠道/微商刚起步怎么找客源
  • 有了域名 建设自己的网站/免费个人网站源码
  • 杭州专业做网站的/如何创建一个个人网站
  • 我要用新浪云做网站/如何宣传推广产品
  • 微博网站开发/长沙全网覆盖的网络推广
  • 一级消防工程师/站长seo查询工具