【算法与数据结构】37、LeetCode解数独

news2024/12/23 20:16:05

文章目录

  • 一、题目
  • 二、解法
  • 三、完整代码

所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。

一、题目

在这里插入图片描述
在这里插入图片描述

二、解法

  思路分析:本题也是一道困难题,难点在于如何构建数独棋盘,如何检查棋盘的合法性,再一个难点在于如何对棋盘进行遍历并放置数字。数组棋盘的构建笔者采用了一个最朴素的方法,将已知的‘.’和数字依次push_back进棋盘数组中;然后根据数独的规则,每行每列,每个九空格内不能有重复的元素,构建isValid函数;然后利用两层嵌套循环遍历棋盘,棋盘的每个点用1-9的数组依次带入,如果合法则进行下一步的递归。最终得到一个数独的解,这个解就是整个棋盘数组,将其输出。
  程序如下

class Solution {
private:
    bool isValid(vector<vector<char>>& board, char num, int row, int col) {   // 检查棋盘是否合法   
        // 检查行列,九空格内是否有重复元素
        for (int i = 0; i < board.size(); i++) {    // 检查列
            if (board[i][col] == num) return false;
        }
        for (int j = 0; j < board[0].size(); j++) {    // 检查行
            if (board[row][j] == num) return false;
        }
        // 检查九空格,找到board[row][col]所在的九空格, 然后用二层循环遍历
        int startRow = (row / 3) * 3;   
        int startCol = (col / 3) * 3;
        for (int i = startRow; i < startRow + 3; i++) {
            for (int j = startCol; j < startCol + 3; j++) {
                if (board[i][j] == num) return false;
            }
        }
        return true;
    }
    bool backtracking(vector<vector<char>>& board) {
        for (int row = 0; row < board.size(); row++) {
            for (int col = 0; col < board[0].size(); col++) {
                if (board[row][col] != '.') continue;
                for (char num = '1'; num <= '9'; num++) {
                    if (isValid(board, num, row, col)) {
                        board[row][col] = num; // 放置数字,处理节点;
                        if(backtracking(board)) return true;   // 递归
                        board[row][col] = '.'; // 回溯,撤销处理结果
                    }
                }
                return false;   // 九个数字都不行,说明数独无解
            }
        }
        return true;
    }
public:
    vector<vector<char>> solveSudoku(vector<vector<char>>& board) {
        backtracking(board);
        return board;
    }
};

复杂度分析:

  • 时间复杂度: O ( n ! ) O(n!) O(n!)
  • 空间复杂度: O ( n ) O(n) O(n)

三、完整代码

# include <iostream>
# include <vector>
# include <string>
using namespace std;

class Solution {
private:
    bool isValid(vector<vector<char>>& board, char num, int row, int col) {   // 检查棋盘是否合法   
        // 检查行列,九空格内是否有重复元素
        for (int i = 0; i < board.size(); i++) {    // 检查列
            if (board[i][col] == num) return false;
        }
        for (int j = 0; j < board[0].size(); j++) {    // 检查行
            if (board[row][j] == num) return false;
        }
        // 检查九空格,找到board[row][col]所在的九空格, 然后用二层循环遍历
        int startRow = (row / 3) * 3;   
        int startCol = (col / 3) * 3;
        for (int i = startRow; i < startRow + 3; i++) {
            for (int j = startCol; j < startCol + 3; j++) {
                if (board[i][j] == num) return false;
            }
        }
        return true;
    }
    bool backtracking(vector<vector<char>>& board) {
        for (int row = 0; row < board.size(); row++) {
            for (int col = 0; col < board[0].size(); col++) {
                if (board[row][col] != '.') continue;
                for (char num = '1'; num <= '9'; num++) {
                    if (isValid(board, num, row, col)) {
                        board[row][col] = num; // 放置数字,处理节点;
                        if(backtracking(board)) return true;   // 递归
                        board[row][col] = '.'; // 回溯,撤销处理结果
                    }
                }
                return false;   // 九个数字都不行,说明数独无解
            }
        }
        return true;
    }
public:
    vector<vector<char>> solveSudoku(vector<vector<char>>& board) {
        backtracking(board);
        return board;
    }
};

int main() {
    vector<vector<char>> board;
    board.push_back({ '5', '3', '.', '.', '7', '.', '.', '.', '.' });
    board.push_back({ '6', '.', '.', '1', '9', '5', '.', '.', '.' });
    board.push_back({ '.', '9', '8', '.', '.', '.', '.', '6', '.' });
    board.push_back({ '8', '.', '.', '.', '6', '.', '.', '.', '3' });
    board.push_back({ '4', '.', '.', '8', '.', '3', '.', '.', '1' });
    board.push_back({ '7', '.', '.', '.', '2', '.', '.', '.', '6' });
    board.push_back({ '.', '6', '.', '.', '.', '.', '2', '8', '.' });
    board.push_back({ '.', '.', '.', '4', '1', '9', '.', '.', '5' });
    board.push_back({ '.', '.', '.', '.', '8', '.', '.', '7', '9' });
    Solution s1;
    vector<vector<char>> result = s1.solveSudoku(board);
    for (vector<vector<char>>::iterator it = result.begin(); it != result.end(); it++) {
        for (vector<char>::iterator jt = (*it).begin(); jt != (*it).end(); jt++) {
            cout << *jt << " ";
        }
        cout << endl;
    }
    system("pause");
    return 0;
}

end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1308938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能优化算法应用:基于树种算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于树种算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于树种算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.树种算法4.实验参数设定5.算法结果6.参考文献7.MA…

前端体系:前端应用

目录 前端体系基础 html&#xff08;超文本标记语言&#xff09; css&#xff08;层叠样式单&#xff09; javascript&#xff08;&#xff09; 一、前端体系概述 二、前端框架 React Vue Angular 三、前端库和工具 lodash Redux Webpack 四、模块化和组件化 ES…

点云几何 之 判断某一点是否在三角形的边上(3)

点云几何 之 判断某一点是否在三角形的边上&#xff08;3&#xff09; 一、算法介绍二、算法实现1.代码2.结果 总结 一、算法介绍 判断某一点是否在三角形的边上 之前已经介绍了点在三角形的内外判断方法&#xff0c;这里增加点恰好在三角形边上的判断方法 &#xff08;本质上…

js基础:函数、对象、WebAPIs-DOM

一、函数和对象 1、函数概述 &#x1f916;chatgpt&#xff1a;什么是函数&#xff1f;为什么要有函数&#xff1f; 函数是一种可重复使用的代码块&#xff0c;它们可以接受输入&#xff08;参数&#xff09;、执行特定的任务&#xff0c;并返回结果。 JavaScript中函数是非常…

springboot整合日志框架log4j2

springboot整合日志框架log4j2 前言&#xff1a;springboot提供了默认的日志框架logback&#xff0c;结合slf4j门面&#xff0c;基于简单配置即可实现日志输出记录。但是实际开发中很多项目会使用log4j2&#xff0c;log4j2是log4j的升级版本&#xff0c;性能和安全性上比log4j…

论文阅读《DPS-Net: Deep Polarimetric Stereo Depth Estimation》

论文地址&#xff1a;https://openaccess.thecvf.com/content/ICCV2023/html/Tian_DPS-Net_Deep_Polarimetric_Stereo_Depth_Estimation_ICCV_2023_paper.html 概述 立体匹配模型难以处理无纹理场景的匹配&#xff0c;现有的方法通常假设物体表面是光滑的&#xff0c;或者光照是…

Linux | 多线程

前言 本文主要介绍多线程基础知识&#xff0c;以及使用多线程技术进行并发编程&#xff1b;最后会介绍生产者消费者模型&#xff1b; 一、线程基本认识 1、什么是线程 如果你是科班出生&#xff0c;你肯定听过线程相关概念&#xff1b;但是你可能没有真正搞懂什么是线程&#…

西班牙语 Alt 代码表

西班牙语 Alt 代码表&#xff0c;请参考下图。 输入方法就是按住 Alt 键不松开&#xff0c;然后在小键盘上输入字符&#xff0c;松开 Alt 键&#xff0c;计算机就能输出上面的字符了。 西班牙语的字符没有法语和德语的多。 西班牙语 Alt 代码表 - 系统容器 - iSharkFly西班牙语…

SpringBoot之实体参数的详细解析

1.3 实体参数 在使用简单参数做为数据传递方式时&#xff0c;前端传递了多少个请求参数&#xff0c;后端controller方法中的形参就要书写多少个。如果请求参数比较多&#xff0c;通过上述的方式一个参数一个参数的接收&#xff0c;会比较繁琐。 此时&#xff0c;我们可以考虑…

MySQL主从复制与读写分离实验

实验一、MySQL主从服务器搭建 实验前准备 Master服务器&#xff1a;192.168.188.14 mysql5.7 Slave服务器1&#xff1a;192.168.188.15 mysql5.7 Slave服务器2&#xff1a;192.168.188.16 mysql5.7 关闭虚拟机防火墙 systemctl stop firewalld setenforce 0 主服务器准…

微搭低代码实现登录注册功能

目录 1 创建用户数据源2 实现登录逻辑3 搭建登录页面4 设置登录框5 实现登录的逻辑6 用户注册总结 原来产品在创建应用的时候可以创建模型应用&#xff0c;模型应用对应我们小程序的后端。最新的更新已经将模型应用的能力下线&#xff0c;那我们不得不自己实现一下后端的逻辑。…

【报错栏】(vue)Module not found: Error: Can‘t resolve ‘element-ui‘ in xxx

Module not found: Error: Cant resolve element-ui in xxx 报错原因是&#xff1a; 未安装 element-ui 依赖 解决&#xff1a; npm install element-ui 运行

智能优化算法应用:基于象群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于象群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于象群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.象群算法4.实验参数设定5.算法结果6.参考文献7.MA…

【SpringBoot】FreeMarker视图渲染

目录 一、FreeMarker 简介 1.1 什么是FreeMarker&#xff1f; 1.2 Freemarker模板组成部分 1.3 为什么要使用FreeMarker 二、Springboot集成FreeMarker 2.1 配置 2.2 数据类型 2.2.1 字符串 2.2.2 数值 2.2.3 布尔值 2.2.4 日期 2.3 常见指令 2.3.2 assign 2.3…

国产仿日立高速离心瓶250ml/500ml/1000ml日立通用离心杯

国产仿日立高速离心瓶250ml/500ml/1000ml日立离心机通用离心杯 250ml高速离心瓶 货号&#xff1a;ZY1136229 材质&#xff1a;PPCO 外径&#xff1a;61 mm 高度&#xff1a;130mm 500ml高速离心瓶 货号&#xff1a;ZY1136219 材质&#xff1a;PPCO 外径&#xff1a;73m…

大模型应用_FastGPT

1 功能 整体功能&#xff0c;想解决什么问题 官方说明&#xff1a;FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&#xff01;个人体会…

【map】【动态规划】LeetCode2713:矩阵中严格递增的单元格数

本文涉及的基础知识点 二分查找算法合集 题目 给你一个下标从 1 开始、大小为 m x n 的整数矩阵 mat&#xff0c;你可以选择任一单元格作为 起始单元格 。 从起始单元格出发&#xff0c;你可以移动到 同一行或同一列 中的任何其他单元格&#xff0c;但前提是目标单元格的值 …

UML-认识6种箭头(画类图无烦恼)

文章目录 一、背景二、箭头详解2.1 泛化&#xff08;Generalization&#xff09;2.2 实现&#xff08;Realize&#xff09;2.3 依赖&#xff08;Dependency&#xff09;2.4 关联&#xff08;Association&#xff09;2.5 聚合&#xff08;Aggregation&#xff09;2.6 组合&#…

npm安装,idea中启动vue失败

node 设置配置之后&#xff0c;要查询时&#xff0c;会从.npmrc中读取路径 .npmrc自己创建的&#xff08;默认情况下.npmrc会创建在C盘中&#xff09; 我创建的在D:\studay-and-working\node16.14\node_modules\npm中 指定.npmrc文件&#xff0c;因为默认会访问C盘的.npmrc文件…

现代雷达车载应用——第2章 汽车雷达系统原理 2.4节 雷达波形和信号处理

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.4 雷达波形和信号处理 对于连续波雷达来说&#xff0c;波形决定了其基本信号处理流程以及一些关键功能。本节将以FMCW波形为例&#xff0c;讨论信号…