力扣 36. 有效的数独 C语言实现

news2025/7/15 17:32:19

题目描述:

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

注意:

一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
空白格用 '.' 表示。

题目链接

 方法:创建三个 9*9 数组

本人感觉此题目较为难理解,前天看了这道题给搁置了,然后今天做了387. 字符串中的第一个唯一字符这道题才有了较为清晰的思路。 

首先创建三个 9* 9 的数组 cols, rows 和 tris 

首先初始化三个数组,令它们每一个元素的值都为0

cols 存放的是每行各个元素中出现的次数

比如实例1 中,board[0][0]='5', 由于board存放的数范围是1-9,那么在cols数组中令

cols[0][5-1]++ = cols[0][4]++,也就是在原来值的基础上加1. 由于board存的是字符类型,所以cols[0][5-1]的计算就是 cols[0][board[0][0]-'1'].

同样,board[1][1] = '6', 在cols数组中 cols[1][6-1]++ = cols[1][5]++ . 对于board中 '.' 的值略过。

同样,rows中,每行存的是 board 每列各元素出现的次数

实例1 中,board[3][0]='8',在rows数组中 rows[0][8-1]++ = rows[0][7]++ = rows[0][board[3][0]-'1'];

board[2][1]='9',在rows数组中 rows[1][9-1]++ = rows[1][8]++; 

下面重点来了,九宫格的计数~

由于一共有9个九宫格,从左到右,从上到下,依次标记每个九宫格索引值为0-2,3-5,6-8   如下图

那么在tris数组中,每行分别代表每个九宫格中元素出现的次数

故已知某个元素的行和列,怎么添加到tris数组的对应位置是一个需要解决的问题。

对于tris的列,我们只需要根据元素来获取即可,所以关键是寻找tris的行,也就是根据一个元素的行和列判断它是在哪个九宫格当中

每3个行位置和列位置更新一个九宫格,所以首先想到的肯定是除以3,如果让行 i/3 那对于第0个九宫格是可以的,而当i=3, 4, 5 时, i/3=1,那么第三个九宫格就不是3而是1. 所以需要再乘3. 也就是 i/3*3 能够准确的判断第0个,第3个和第6个九宫格。那么对于其他九宫格,我们就在列 j 上想办法。由于列也是每3个位置更新一个九宫格,故再让j/3,也就是  i/3*3+j/3  通过元素的行和列来验证此公式发现是可以的,这样我们就成功的解决了上面的问题。

将九宫格看成是 3*3 的数组,其中 i/3*3 代表的是九宫格行的位置。i/3 其实就是令每一个 i 处在第0、1、2三个位置,而九宫格不只有三行,还有三列,所以再乘3 令每个九宫格的行位置准确。而九宫格的列就是 j/3行+列就代表九宫格的位置。 

下面是代码展示

bool isValidSudoku(char** board, int boardSize, int* boardColSize){
    int rows[9][9];
    int cols[9][9];
    int tris[9][9];

    // 数组初始化 令每个元素都为0
    memset(rows, 0, sizeof(rows));
    memset(cols, 0, sizeof(cols));
    memset(tris, 0, sizeof(tris));
    
    // 将行、列和九宫格元素存在的个数分别存到三个数组中
    for(int i=0; i<9; ++i)
    {
        for(int j=0; j<9; ++j)
        {
            if(board[i][j]!='.')
            {
                int temp = board[i][j];
                
                rows[i][temp-'1']++;
                tris[i/3*3+j/3][temp-'1']++;
            }
            if(board[j][i]!='.')
            {
                int temp = board[j][i];
                cols[i][temp-'1']++;

            }
        }
    }
    
    // 判断 三个数组中是否有大于1的元素
    for(int i=0; i<9; ++i)
    {
        for(int j=0; j<9; ++j)
        {
            if(rows[i][j]>1 || cols[i][j]>1 || tris[i][j]>1)
            {
                return false;
            }
        }
    }
    
    return true;
}

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

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

相关文章

嵌入式驱动初级-阻塞与非阻塞

文章目录前言一、五种IO模型二、阻塞与非阻塞三、多路复用四、信号驱动前言 记录嵌入式驱动学习笔记 一、五种IO模型 当应用程序对设备驱动进行操作的时候&#xff0c;如果不能获取到设备资源&#xff0c;那么阻塞式 IO 就会将应用程 序对应的线程挂起&#xff0c;直到设备资源…

LeetCode刷题复盘笔记—一文搞懂纯0-1背包问题(动态规划系列第六篇)

今日主要总结一下动态规划背包问题的基础——纯0-1背包问题 在Leetcode题库中主要都是01背包和完全背包的应用问题&#xff0c;所以主要掌握这两个背包问题 题目&#xff1a;纯0-1背包问题 题目描述&#xff1a; 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是wei…

推特自动发帖,全天占据核心流量

利用热门趋势和Hashtags标签 Twitter有一个热门趋势&#xff0c;跟微博热搜是差不多的&#xff0c;卖家可以多关注一下热门趋势&#xff0c;看看有没有和产品相关的内容。在帖子中加入趋势性和热门的标签&#xff0c;是一种非常好的营销方式。 这一方面能够增加推文的热度&am…

【Linux】(五)GateWay远程开发方式-实验室服务器使用GateWay远程开发

Jetbrains GateWay 方式系列文章一、服务器情况简介1.1服务器及用户1.2 cuda1.3 conda环境二、Jetbrains GateWay方式连接2.1 下载2.2 配置2.3 连接管理及附加说明2.3.1 关闭或退出2.3.2 重连附录公共数据集系列文章 &#xff08;一&#xff09;服务器初次配置及安装vncserver…

基于MxNet实现目标检测-YoloV4【附部分源码及模型】

文章目录前言目标检测发展史及意义一、数据集的准备1.标注工具的安装2.数据集的准备3.标注数据4.解释xml文件的内容二、网络结构的介绍三、代码实现0.工程目录结构如下1.导入库2.配置GPU/CPU环境3.数据加载器4.模型构建5.模型训练1.学习率设置2.优化器设置3.损失设置4.循环训练…

Hive基本使用

Hive系列第三章 第三章 基本使用 1、 创建库&#xff1a;create database mydb; 2、 查看库&#xff1a;show databases; 3、 切换数据库&#xff1a;use mydb; 3.1 访问Hive的方式 3.1.1 直接可以在客户端Hive进入 见2.5.8 启动hive客户端 3.1.2 使用JDBC方式 先知道&am…

汽车零部件加工行业工业互联网智能工厂解决方案

汽车零部件分类 汽车零部件是汽车工业发展的基础。按功能分类如下&#xff1a; 零部件分类 主要产品 发动系统 发动机总成、滤清器、气缸及部件、油箱、曲轴、凸轮轴、气门及部件、皮带、增压器、化油器、燃油喷射装置、其他发动系统 传动系统 离合器、减速器总成、变速器…

【C++ STL】-- 二叉搜索树

目录 二叉搜索树概念 二叉搜索树的应用 二叉搜索树的实现&#xff08;K模型&#xff09; 构造函数 默认拷贝构造函数 赋值运算符重载函数 普通写法&#xff1a; 进阶写法&#xff1a; 析构函数 插入函数&#xff08;Insert&#xff09;的实现 常规实现&#xff1a; …

解决Windows环境下的docker中修改了mysql的配置文件之后启动不了的问题

** 前情简介&#xff1a; ** 由于在docker中安装的mysql5.7中区分表的大小写&#xff0c;进入到mysql的命令行模式之后就修改配置文件&#xff0c;主要修改 lower_case_table_names1修改之后就启动再也启动不起来了&#xff0c;说我配置文件改错了 2022-11-25 14:47:5400:0…

ThingsBoard源码解析-消息队列

概述 消息队列是thingsboard支持集群的基础&#xff0c;比如使用Kafka可实现消息在整个服务集群中共同处理&#xff0c;提高性能。如果是内存队列&#xff0c;则无法再服务实例间共享消息。 定义 在module【common/cluster-api】的org.thingsboard.server.queue包定义了消息…

排名预测系统

排名预测系统 题目链接 题目背景&#xff1a; 本题大模拟来自真实的需求&#xff0c;即&#xff1a;综合三场网络赛的名次&#xff0c;来预计一个正式队伍在所有正式参赛队伍中的名次以此来估计自己能不能拿牌。本来只有一道题&#xff0c;即为你们看到的T5&#xff0c;经过…

【Linux kernel/cpufreq】framework ----big Little driver

Linux kernel支持ARM bigLttile框架的解决方案 一般ARM SOC包含能效和性能两个cluster&#xff0c;共8个 core&#xff0c;可以把这8个core统统开放给kernel&#xff0c;让kernel的调度器&#xff08;scheduler&#xff09;根据系统的实际情况&#xff0c;决定哪些任务应该在哪…

C++ 值传递、引用传递、指针传递

一、简介 参数传递的三种方式&#xff1a;值传递、引用传递、指针传递 二、举例如下 #if 1 值传递 引用传递 指针传递的区别void value_input(int a){cout << "值传递------函数" <<&a <<endl;a 100;}void Pointer_input(int * n){cou…

云上办公兴起,华为云桌面Workspace更靠谱

云上办公兴起&#xff0c;华为云桌面Workspace更靠谱 为了办公的便利性&#xff0c;也趁着华为云推行“实惠更实用&#xff0c;11都如愿”的主题活动&#xff0c;许多企业果断入手了华为云桌面Workspace服务&#xff0c;当亲自试用后&#xff0c;才逐渐感受使用华为云桌面Work…

FPGA+ARM异核架构,基于米尔MYC-JX8MMA7核心板的全自动血细胞分析仪

全自动血细胞分析仪是医院临床检验应用非常广泛的仪器之一&#xff0c;用来检测红细胞、血红蛋白、白细胞、血小板等项目。是基于电子技术和自动化技术的全自动智能设备&#xff0c;功能齐全&#xff0c;操作简单&#xff0c;依托相关计算机系统在数据处理和数据分析等方面具有…

脚气、灰指甲治疗实验方案

脚气 &#xff08;已临床实验&#xff09; 脚气&#xff0c;又叫足廯、香港脚。 糜烂性脚气 症状&#xff1a;80%都是这种类型。常见于多汗人群。角质层被汗水浸软&#xff0c;发白了以后&#xff0c;走动不断摩擦表皮脱落&#xff0c;露出鲜红色糜烂面&#xff0c;瘙痒剧烈&…

什么是分布式软件系统

:什么是分布式软件系统&#xff1f;分布式软件系统是什么意思&#xff1f; 分布式软件系统(Distributed Software Systems)是支持分布式处理的软件系统,是在由通信网络互联的多处理机体系结构上执行任务的系统。它包括分布式操作系统、分布式程序设计语言及其编译(解释)系统、分…

[附源码]java毕业设计疫情状况下生活物资集体团购系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[毕业设计]大数据电影数据分析可视化

目录 前言 课题背景和意义 实现技术思路 网页分析 索引页 详情页 反爬破解 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,…

Unity UI 框架相关的一些思考

开源地址&#xff1a; GitHub - NRatel/NRFramework.UI: 基于 Unity UGUI 的 UI 开发框架基于 Unity UGUI 的 UI 开发框架. Contribute to NRatel/NRFramework.UI development by creating an account on GitHub.https://github.com/NRatel/NRFramework.UI 简介&#xff1a;…