37. 解数独 - 力扣(LeetCode)
基础知识要求:
Java: 方法、for循环、if else语句、数组
Python: 方法、for循环、if else语句、列表
题目:
编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
- 数字
1-9在每一行只能出现一次。 - 数字
1-9在每一列只能出现一次。 - 数字
1-9在每一个以粗实线分隔的3x3宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 '.' 表示。
示例 1:

输入:board = [["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]] 输出:[["5","3","4","6","7","8","9","1","2"],["6","7","2","1","9","5","3","4","8"],["1","9","8","3","4","2","5","6","7"],["8","5","9","7","6","1","4","2","3"],["4","2","6","8","5","3","7","9","1"],["7","1","3","9","2","4","8","5","6"],["9","6","1","5","3","7","2","8","4"],["2","8","7","4","1","9","6","3","5"],["3","4","5","2","8","6","1","7","9"]] 解释:输入的数独如上图所示,唯一有效的解决方案如下所示:

提示:
board.length == 9board[i].length == 9board[i][j]是一位数字或者'.'- 题目数据 保证 输入数独仅有一个解
思路解析:
这个解题思路是一个典型的回溯算法在数独求解问题上的应用,它非常直观且易于理解。下面是对这个解题思路的总结:
- 初始化:
- 提供一个初始的数独板(在这个例子中是通过一个二维列表表示的)。
- 如果数独板没有完全填充(即含有
.作为占位符),则需要进行求解。
- 定义
is_valid函数:- 这是一个辅助函数,用于检查在给定位置
(row, col)填入数字num是否有效。 - 检查包括:当前行、当前列以及所在的3x3宫格内是否已存在该数字。
- 这是一个辅助函数,用于检查在给定位置
- 定义
solve_sudoku函数:- 这是求解数独的核心函数,它使用回溯法来尝试填充每一个空格。
- 对于数独板上的每一个空格(即值为
.的位置):- 尝试填入数字1到9。
- 如果填入某个数字后,数独仍然有效(通过
is_valid函数检查),则继续递归地求解剩余的空格。 - 如果递归求解成功(即找到了一个解),则返回True。
- 如果递归求解失败(即当前数字不合适),则回溯,将该空格重新置为
.,并尝试下一个数字。
- 如果尝试完所有数字后仍然没有找到解,则返回False。
- 如果所有空格都成功填充,则返回True,表示找到了一个解。
- 求解与输出:
- 调用
solve_sudoku函数来求解数独。 - 如果求解成功,则打印出解出的数独板;否则,输出“无解”。
- 调用
Java代码示例:
public class SudokuSolver { // 检查数字在行、列和3x3宫格内是否有效 public static boolean isValid(char[][] board, int row, int col, char num) { // 检查行 for (int i = 0; i < 9; i++) { if (board[row][i] == num) { return false; } } // 检查列 for (int i = 0; i < 9; i++) { if (board[i][col] == num) { return false; } } // 检查3x3宫格 int startRow = 3 * (row / 3); int startCol = 3 * (col / 3); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (board[i + startRow][j + startCol] == num) { return false; } } } return true; } // 递归求解数独 public static boolean solveSudoku(char[][] board) { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { if (board[i][j] == '.') { for (char num = '1'; num <= '9'; num++) { if (isValid(board, i, j, num)) { board[i][j] = num; // 递归尝试下一个空格 if (solveSudoku(board)) { return true; } // 回溯 board[i][j] = '.'; } } // 尝试完所有数字都不可行,说明当前空格无解,返回false return false; } } } // 所有空格都填满了,说明找到解了 return true; } // 主函数,用于测试 public static void main(String[] args) { char[][] board = { {'5', '3', '.', '.', '7', '.', '.', '.', '.'}, {'6', '.', '.', '1', '9', '5', '.', '.', '.'}, {'.', '9', '8', '.', '.', '.', '.', '6', '.'}, {'8', '.', '.', '.', '6', '.', '.', '.', '3'}, {'4', '.', '.', '8', '.', '3', '.', '.', '1'}, {'7', '.', '.', '.', '2', '.', '.', '.', '6'}, {'.', '6', '.', '.', '.', '.', '2', '8', '.'}, {'.', '.', '.', '4', '1', '9', '.', '.', '5'}, {'.', '.', '.', '.', '8', '.', '.', '7', '9'} }; if (solveSudoku(board)) { // 格式化输出 for (char[] row : board) { for (char num : row) { System.out.print(num + " "); } System.out.println(); } } else { System.out.println("无解"); } }
}
Python代码示例:
def is_valid(board, row, col, num): # 检查行中是否已存在该数字 for i in range(9): if board[row][i] == num: return False # 检查列中是否已存在该数字 for i in range(9): if board[i][col] == num: return False # 检查3x3宫格中是否已存在该数字 start_row = 3 * (row // 3) start_col = 3 * (col // 3) for i in range(3): for j in range(3): if board[i + start_row][j + start_col] == num: return False return Truedef solve_sudoku(board): for i in range(9): for j in range(9): if board[i][j] == '.': for num in ['1', '2', '3', '4', '5', '6', '7', '8', '9']: if is_valid(board, i, j, num): board[i][j] = num if solve_sudoku(board): return True # 如果当前数字不合法,回溯 board[i][j] = '.' # 尝试完所有数字都不可行,说明无解 return False # 所有空格都填满了,说明找到解了 return True # 示例输入
board = [["5","3",".",".","7",".",".",".","."], ["6",".",".","1","9","5",".",".","."], [".","9","8",".",".",".",".","6","."], ["8",".",".",".","6",".",".",".","3"], ["4",".",".","8",".","3",".",".","1"], ["7",".",".",".","2",".",".",".","6"], [".","6",".",".",".",".","2","8","."], [".",".",".","4","1","9",".",".","5"], [".",".",".",".","8",".",".","7","9"]] # 转换为二维列表
board = [list(map(str, row)) for row in board] # 求解数独
if solve_sudoku(board): # 格式化输出 for row in board: print(row)
else: print("无解")
相关文章:
37. 解数独 - 力扣(LeetCode)
基础知识要求: Java: 方法、for循环、if else语句、数组 Python: 方法、for循环、if else语句、列表 题目: 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行…...
使用uniapp编写的微信小程序进行分包
简介: 由于小程序发布的时候每个包最多只能放置2MB的东西,所以把所有的代码资源都放置在一个主包当中不显示,所以就需要进行合理分包,,但是分包后整个小程序最终不能超过20MB。 一般情况下,我习惯将tabba…...
设计模式19——观察者模式
写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 观察者模式(Observ…...
C++算术运算和自增自减运算
一 引言 表示运算的符号称为运算符。 算术运算; 比较运算; 逻辑运算; 位运算; 1 算术运算 算术运算包括加、减、乘、除、乘方、指数、对数、三角函数、求余函数,这些都是算术运算。 C中用、-、*、/、%分别表示加、减…...
Python深度学习:【模型系列】一文搞懂Transformer架构的三种注意力机制
文章目录 1. 什么是注意力机制?2. Transformer 的注意力层2.1 注意力机制基础2.2 理解Q,K,V2.3 交叉注意力层2.4 全局自注意力层2.5 因果注意力层3. 位置编码4. 多头注意力机制5. 总结1. 什么是注意力机制? 注意力机制最初受到人类视觉注意力的启发,目的是让模型在处理大…...
微服务架构中Java的应用
在微服务架构中,Java是一种非常常用的编程语言。Java生态系统非常庞大,有许多框架和工具可以用来构建和管理微服务。 以下是一些在微服务架构中使用Java编写的应用程序的示例: Spring Boot和Spring Cloud:Spring Boot是一种用于快…...
【强训笔记】day25
NO.1 思路:哈希质数判断。 代码实现: #include <iostream> #include<string> #include<cmath> using namespace std;bool isprime(int n) {if(n<2) return false;for(int i2;i<sqrt(n);i){if(n%i0) return false;}return true…...
知识产权与标准化
知识产权与标准化 导航 文章目录 知识产权与标准化导航一、知识产权概述二、保护范围与对象三、保护期限四、知识产权归属五、侵权判定六、标准的分类 一、知识产权概述 知识产权:知识产权是指人们就其智力劳动成果所依法享有的专有权利,通常是国家赋予创造者对其…...
【LeetCode:2769. 找出最大的可达成数字 + 模拟】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
编程5年的老哥说:我代码里从来不用锁,谁爱...
技多不压身! 大家好,我是 javapub。 今天一个朋友找我吐槽,说自己平时在工作中几乎用不到需要上锁的场景,就算有也只是并发很小、或者直接从有业务设计上就规避掉了。但一到面试,都是各种锁题,很头疼。 面…...
CogAgent:开创性的VLM在GUI理解和自动化任务中的突破
尽管LLMs如ChatGPT在撰写电子邮件等任务上能够提供帮助,它们在理解和与GUIs交互方面存在挑战,这限制了它们在提高自动化水平方面的潜力。数字世界中的自主代理是许多现代人梦寐以求的理想助手。这些代理能够根据用户输入的任务描述自动完成如在线预订票务…...
C++容器之位集(std::bitset)
目录 1 概述2 使用实例3 接口使用3.1 constructor3.2 count_and_size3.3 test3.4 any3.5 none3.6 all3.7 set3.8 reset3.9 filp3.10 to_string3.11 to_ulong3.12 to_ullong3.13 operators1 概述 位集存储位(只有两个可能值的元素:0或1,true或false,…)。 该类模拟bool…...
《Ai学习笔记》自然语言处理 (Natural Language Processing):常见机器阅读理解模型(上)02
Glove 词向量: 在机器理解中的词的表示: 词袋(bow,bag of words) one-hot 词向量 word2vec glove 目的:将一个词转换成一个向量 Word2vec 是一种用于生成词向量的工具包,由Google在2013年开源推出…...
老师如何在线发布期末考试成绩查询?
在这个数字化时代,教育领域也迎来了翻天覆地的变化。传统的纸质成绩查询方式已经逐渐被在线成绩查询所替代。如何高效、便捷地进行在线期末考试成绩查询? 成绩的录入与上传。教师需要将学生的考试成绩准确无误地录入系统。这一步骤需要细心和耐心&#x…...
TensorBoard相关学习
TensorBoard是Google为TensorFlow框架开发的一个强大的可视化工具,它可以帮助用户更直观地理解、分析和调试机器学习模型的训练过程。通过TensorBoard,你可以可视化模型的结构、监控训练过程中的指标变化(如损失函数、准确率)、查…...
敏感数据处理的艺术:安全高效的数据提取实践与挑战
在数字化时代,数据已成为驱动经济社会发展的核心要素之一。然而,伴随数据量的爆炸性增长,敏感数据的管理和保护成为了信息安全领域的重大挑战。敏感数据,包括个人身份信息、财务记录、健康档案、商业秘密等,一旦泄露&a…...
使用Python操作excel单元格——获取带公式单元格的值
一、前言 通过使用Python的openpyxl库,来操作excel单元格,获取带公式的单元格中的值。 把学习的过程分享给大家。大佬勿喷! 二、程序展示 1、表格准备 使用前面创建过的表格,获取B6单元格的求和值。 2、获取表格的值 wb o…...
PHP开发入门
PHP官网:PHP: Hypertext Preprocessor apache官网:https://httpd.apache.org/ 一、搭建PHP环境 下载apache 进入官网点击download 选择下载windows版本文件 点击进入下载界面 点击下载64位版本文件 下载后解压文件 解压文件后进入 D:\httpd-2.4.59-24…...
HBase分布式数据库入门到精通
文章目录 HBase分布式数据库入门到精通 一、简单介绍 二、HBase数据模型 三、HBase的架构 四、HBase写操作流程 五、HBase读操作流程 六、HBase minor小合并和major大合并 七、HBase目标表meta表 八、HBase特点 九、HBase的使用场景 HBase分布式数据库入门到精通 一、…...
Java程序员必备技能之MySQL数据库 图解整理/快速入门
恭喜大家来到全新的篇章——MySQL数据库,这一篇我们将学会MySQL数据库的原理、使用sql对数据库的增删改查操作、以及对MySQL数据库的权限管理和用户管理等内容。请大家耐心看下去,相信大家在看完这篇文章后,一定可以学会MySQL数据库(不会Java也可以学会!)。 ps:想要补充…...
风云三国2.4问鼎天下:不靠作弊代码,用TXT文件修改实现俘虏名将和强制投降
风云三国2.4问鼎天下:TXT文件修改实现俘虏名将与强制投降的硬核技巧 在《风云三国2.4问鼎天下》这款经典MOD中,许多玩家都渴望能够招降那些赫赫有名的武将,比如关羽、诸葛亮等,但游戏机制往往让这些名将难以归顺。传统的作弊代码虽…...
研究生必看:论文机制图、流程图快速画法
在学术研究中,高质量的科研配图往往是论文能否被接收的关键因素之一。然而,对于没有专业绘画背景的科研人员来说,传统绘图软件的学习成本高、操作复杂,往往让人望而却步。MedPeer科研绘图工具正是为解决这一痛点而设计——让科研人…...
基于 SOFAJRaft + Spring Boot 构建高可用 KV 存储集群(完整源码)
基于 SOFAJRaft + Spring Boot 构建高可用 KV 存储集群(完整源码) 引言 在分布式系统中,一致性 是核心难题。Raft 是比 Paxos 更易于理解的共识算法,而 SOFAJRaft 是蚂蚁集团开源的 Java 高性能 Raft 实现。 本文带你从零构建一个 3 节点高可用 KV 存储集群,包含完整源码、…...
租房避坑|在成都,我从“凑合住”到“安心住”经历了什么
姐妹们,千万别被“凤凰大街包租”几个字骗了!我的真实租房血泪史是不是最近总刷到那种“凤凰大街包租”“拎包入住”的宣传?说实话,刚来成都那会儿,我也被这些词儿晃花了眼。想着省心省力,结果踩的坑一个接…...
如何5分钟部署AI斗地主助手:从零开始打造你的智能游戏伙伴
如何5分钟部署AI斗地主助手:从零开始打造你的智能游戏伙伴 【免费下载链接】DouZero_For_HappyDouDiZhu 基于DouZero定制AI实战欢乐斗地主 项目地址: https://gitcode.com/gh_mirrors/do/DouZero_For_HappyDouDiZhu 还在为斗地主游戏中的决策烦恼吗ÿ…...
i.MX6ULL电容触摸驱动开发:从硬件原理到Linux输入子系统实战
1. 项目概述:从零到一,搞定i.MX6ULL电容触摸最近在搞一个基于i.MX6ULL的工控HMI项目,客户要求界面操作必须流畅跟手,这就对触摸屏的响应速度和精度提出了硬性要求。市面上很多现成的模块要么驱动兼容性差,要么调试信息…...
3行代码实现语音检索:用FunASR从10万段音频中精准定位关键信息
3行代码实现语音检索:用FunASR从10万段音频中精准定位关键信息 【免费下载链接】FunASR A Fundamental End-to-End Speech Recognition Toolkit and Open Source SOTA Pretrained Models, Supporting Speech Recognition, Voice Activity Detection, Text Post-proc…...
麒麟KylinOS 2303系统管理员必备:用模板为新用户批量配置统一电源策略
麒麟KylinOS 2303系统管理员实战:批量配置用户电源策略的模板化方案 在企业办公环境或学校机房中,麒麟KylinOS系统管理员经常面临统一管理多台电脑电源策略的需求。传统逐台配置的方式效率低下,而通过/etc/skel/用户模板目录的机制࿰…...
别再乱接线了!用PulseView+逻辑分析仪抓STM32 SPI波形,保姆级避坑指南
逻辑分析仪实战:精准捕获STM32 SPI波形的五大黄金法则 当你在调试STM32的SPI外设时,是否遇到过这样的困境:代码配置完全按照手册操作,但逻辑分析仪显示的波形却充满毛刺、数据残缺不全?这往往不是代码逻辑的问题&#…...
别再只盯着AB相了!三引脚EC35编码器在智能面板上的应用与防误触设计
三引脚EC35编码器在智能面板设计中的创新应用与抗干扰实践 旋钮交互在智能家居和工业HMI领域从未失去它的魅力——当用户手指触碰到那个精致的金属环时,物理反馈带来的确定感是纯触控界面无法替代的。但传统AB相编码器的误触发问题长期困扰着产品设计师:…...
