37. 解数独 - 力扣(LeetCode)

基础知识要求:

Java: 方法、for循环、if else语句、数组

Python: 方法、for循环、if else语句、列表

题目: 

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

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

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 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 == 9
  • board[i].length == 9
  • board[i][j] 是一位数字或者 '.'
  • 题目数据 保证 输入数独仅有一个解

思路解析:

这个解题思路是一个典型的回溯算法在数独求解问题上的应用,它非常直观且易于理解。下面是对这个解题思路的总结:

  1. 初始化
    • 提供一个初始的数独板(在这个例子中是通过一个二维列表表示的)。
    • 如果数独板没有完全填充(即含有.作为占位符),则需要进行求解。
  2. 定义is_valid函数
    • 这是一个辅助函数,用于检查在给定位置(row, col)填入数字num是否有效。
    • 检查包括:当前行、当前列以及所在的3x3宫格内是否已存在该数字。
  3. 定义solve_sudoku函数
    • 这是求解数独的核心函数,它使用回溯法来尝试填充每一个空格。
    • 对于数独板上的每一个空格(即值为.的位置):
      • 尝试填入数字1到9。
      • 如果填入某个数字后,数独仍然有效(通过is_valid函数检查),则继续递归地求解剩余的空格。
      • 如果递归求解成功(即找到了一个解),则返回True。
      • 如果递归求解失败(即当前数字不合适),则回溯,将该空格重新置为.,并尝试下一个数字。
    • 如果尝试完所有数字后仍然没有找到解,则返回False。
    • 如果所有空格都成功填充,则返回True,表示找到了一个解。
  4. 求解与输出
    • 调用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("无解")

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

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

相关文章

Windows搭建Nginx代理本地盘的文件(共享路径或本地路径)

文章目录 Windows搭建Nginx代理本地盘的文件 - 前言需求背景挂载网络共享路径检查连接状态下载Nginx编辑 Nginx 配置文件启动 Nginx检测Nginx是否成功启动使用方法远程共享路径示例本地文件示例 测试 Windows搭建Nginx代理本地盘的文件 - 前言 在开发过程中&#xff0c;确保文…

ChatGPT Mac客户端 下载安装教程(免费 不限次数使用 还支持语音聊天)

ChatGPT Mac客户端 下载安装教程&#xff08;免费 不限次数使用 还支持语音聊天&#xff09; 原文链接&#xff1a;https://blog.csdn.net/weixin_48311847/article/details/139248625 免费 不限次数使用 还支持语音聊天

曼城四连冠,剑南春与万千球迷共同见证“荣耀时刻”

执笔 | 洪大大 编辑 | 扬 灵 5月19日&#xff0c;英超2023-2024赛季第38轮比赛全面开打&#xff0c;凭借队员的出色发挥&#xff0c;曼城最终以3-1战胜西汉姆联&#xff0c;成功捧起了英超联赛的奖杯&#xff0c;成为英格兰足球顶级联赛100多年历史上第一支成就四连冠的豪门…

事务报错没有显示回滚导致DDL阻塞引发的问题

在业务开发过程中&#xff0c;显示的开启事务并且在事务处理过程中对不同的情况进行显示的COMMIT或ROLLBACK&#xff0c;这是一个完整数据库事务处理的闭环过程。 这种在应用开发逻辑层面去handle的事务执行的结果&#xff0c;既确保了事务操作的数据完整性&#xff0c;又遵循了…

探索未来设计新境界,PSAI插件 艺术创作神器来袭!

想象一下&#xff0c;如果有一个工具&#xff0c;能够让你的设计工作变得既简单又高效&#xff0c;那会是怎样的体验&#xff1f;现在&#xff0c;梦想成真了&#xff01; 这是一款革命性的PSAI设计插件&#xff0c;专为创意人士打造。它将彻底改变你的设计流程&#xff0c;让你…

【OpenCV】像素信息统计

介绍了计算像素均值、方差的API&#xff0c;以及统计像素信息的方法。相关API&#xff1a; minMaxLoc()mean()meanStdDev() 代码&#xff1a; #include "iostream" #include "opencv2/opencv.hpp"using namespace std; using namespace cv;int main(int…

【全开源】JAVA同城搬家系统源码小程序APP源码

JAVA同城搬家系统源码 特色功能&#xff1a; 强大的数据处理能力&#xff1a;JAVA提供了丰富的数据结构和算法&#xff0c;以及强大的并发处理能力&#xff0c;使得系统能够快速地处理大量的货物信息、司机信息、订单信息等&#xff0c;满足大规模物流的需求。智能路径规划&a…

香橙派 AIPro开发板上手测评

前言 最近拿到了一个新玩具&#xff1a;香橙派 AIPro。一个只比银行卡大一点点的开发板能带给我们多少惊喜呢&#xff1f;接下来就跟我一起来体验下这块开发板的魅力。 一、硬件配置 CPU&#xff1a;配备了4核64位ARM处理器&#xff0c;其中默认预留1个给AI处理器使用 NPU&am…

SpringBoot和Apache Doris实现实时广告推荐系统

本专题旨在向读者深度解读Apache Doris技术,探讨其与SpringBoot框架结合在各类实际应用场景中的角色与作用。本专题包括十篇文章,每篇文章都概述了一个特定应用领域,如大数据分析、实时报告系统、电商数据分析等,并通过对需求的解析、解决方案的设计、实际应用示例的展示以…

【Python实战】你还在冲会员看电影电视剧吗?Python带你实现各大资源免费看!

前言 halo&#xff0c;包子们下午好 今天给大家实现一个视频播放器&#xff0c;可以看任何电影&#xff0c;电视剧&#xff0c;不要再为以后看电视看电影而烦恼&#xff0c;今天是福利文章&#xff0c;相信我绝对有用&#xff01; 开发工具 Python版本&#xff1a;3.7.8 相…

驱动未来:IT行业的现状与发展趋势

前言 随着技术的不断进步&#xff0c;IT行业已成为推动全球经济和社会发展的关键力量。从云计算、大数据、人工智能到物联网、5G通信和区块链&#xff0c;这些技术正在重塑我们的生活和工作方式。本文将探讨IT行业的现状和未来发展趋势&#xff0c;并邀请行业领袖、技术专家和…

Follow Your Pose: Pose-Guided Text-to-Video Generation using Pose-Free Videos

清华深&港科&深先进&Tencent AAAI24https://github.com/mayuelala/FollowYourPose 问题引入 本文的任务是根据文本来生成高质量的角色视频&#xff0c;并且可以通过pose来控制任务的姿势&#xff1b;当前缺少video-pose caption数据集&#xff0c;所以提出一个两…

拿捏数据结构- 链式二叉树

链式二叉树的概念&#xff1a; 链式二叉树解决的是非完全二叉树解决不了的问题 什么意思呢&#xff0c;简单的说就是&#xff0c;链式二叉树 可以是下面三种二叉树 但是非链式二叉树只能是前两种 链式二叉树的存储 节点结构&#xff1a;首先定义一个结构体或类来表示二叉树的节…

单元测试的实现方式

单元测试的实现方式包括&#xff1a;人工静态检查、动态执行跟踪 人工静态检查 人工静态检查是一种单元测试实现方式&#xff0c;它主要依赖开发人员的人工代码审查和静态分析工具来识别潜在的代码问题。 代码审查&#xff1a;开发人员通过仔细检查代码来发现潜在的问题。他…

不怕YOLOv10高歌猛进,我有YOLOv8稳扎稳打

YOLOv10 出来有几天时间了&#xff0c;这次我没有选择第一时间出文章解析&#xff0c;如此频繁的发布数字版本的 YOLO 着实让人头疼&#xff0c;虽然数字的更新并非旧版技术的过时&#xff0c; 但是这肯定会让很多在校同学增加很多焦虑情绪。这里还是请大家辩证看待。 v10 这次…

区间选点问题-贪心-C++

问题&#xff1a; 给定 &#x1d441; 个闭区间 [ai,bi]&#xff0c;请你在数轴上选择尽量少的点&#xff0c;使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 输入格式 第一行包含整数 &#x1d441;&#xff0c;表示区间数…

CSS文本粒子动画特效之爱心粒子文字特效-Canvas

1. 效果图 2.完整代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><style>body,html {margin: 0;paddin…

order by工作过程和优化

工作过程 order by 是由优化器决定的&#xff0c;如果优化器认为filesort速度快&#xff0c;那么走filesort排序&#xff0c;如果优化器认为索引速度快&#xff0c;那么走索引排序。

有一个3x4的矩阵,求矩阵中所有元素中的最大值。要求用函数处理

解此题的算法已在之前的文章中介绍&#xff0c;详见&#xff1a;https://mp.csdn.net/mp_blog/creation/editor/139181787 编写程序&#xff1a; 运行结果&#xff1a;

卷径计算(PID输出补偿法 SCL源代码)

卷径计算有很多方法,这里我们提供另一个思路,这里我们采用的是通过速度控制间接控制张力通过线速度和系统卷径我们可以计算出我们的速度前馈量(主速度)。具体收放卷前馈量计算可以参考下面文章链接: 收放卷前馈量计算FC(梯形图+SCL代码)-CSDN博客文章浏览阅读584次。这篇博…