java解数独(力扣Leetcode37)

数独问题

力扣原题链接

问题描述

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

  • 数字 1-9 在每一行只能出现一次。
  • 数字 1-9 在每一列只能出现一次。
  • 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

数独部分空格内已填入了数字,空白格用'.'表示。

示例

示例:

输入: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"]]

解题思路

我们可以使用回溯算法来解决数独问题。

  1. 遍历数独中的每一个格子,如果格子为空白,就尝试填入数字 1-9,然后检查填入后是否合法。
  2. 若填入的数字合法,则继续递归地填充下一个格子。
  3. 若填入的数字不合法,则回溯到上一个状态,尝试其他的数字。
  4. 当遍历到最后一个格子时,如果所有的格子都已经被填满且合法,则找到了一个解决方案。

复杂度分析

  • 时间复杂度:回溯算法的时间复杂度取决于数独的解的数量。对于 9x9 的数独,一般情况下有多个解,因此时间复杂度是指数级别的。
  • 空间复杂度:O(1),除了结果列表之外,主要消耗的是递归调用栈的空间。

好的,下面是这个代码的算法步骤演示:

算法步骤演示

  1. 初始化

    • 创建一个函数 solveSudoku,该函数接受一个二维字符数组 board 作为参数。
    • solveSudoku 函数中调用 backtrack 函数,并将 board 作为参数传递给它。
  2. 回溯函数

    • 回溯函数 backtrack 接受一个二维字符数组 board 作为参数,它用于填充数独的空白格子。
    • 遍历数独的每一个格子:
      • 如果当前格子为空白 '.',则尝试填入数字 '1''9'
      • 对于每一个尝试填入的数字,检查该数字是否合法(满足数独规则):
        • 检查当前行是否包含目标字符。
        • 检查当前列是否包含目标字符。
        • 检查当前 3x3 宫是否包含目标字符。
      • 如果该数字合法,则将其填入当前格子,并递归调用 backtrack 函数,尝试填充下一个格子。
      • 如果递归调用返回 true,表示找到了一个解决方案,直接返回 true
      • 如果递归调用返回 false,表示当前尝试不成功,回溯到上一个状态,继续尝试其他的数字。
    • 如果遍历完所有的格子都成功填充,说明找到了一个解决方案,返回 true
    • 如果没有找到解决方案,返回 false
  3. 检查数字合法性的函数

    • 检查数字合法性的函数 isvalid 接受一个二维字符数组 board、要填入的数字 c、以及目标格子的行坐标 row 和列坐标 col 作为参数。
    • 首先根据目标格子的位置计算出当前 3x3 宫的左上角的行坐标和列坐标。
    • 然后分别检查当前行、当前列以及当前 3x3 宫是否包含目标数字 c
    • 如果不包含目标数字,则返回 true,否则返回 false

请添加图片描述

算法实现

class Solution {// 解决数独问题的入口方法public void solveSudoku(char[][] board) {backtrack(board);}// 回溯函数,用于填充数独格子boolean backtrack(char[][] board) {// 遍历数独格子for (int i = 0; i < board.length; i++) {for (int j = 0; j < board.length; j++) {// 如果当前格子为空白if (board[i][j] == '.') {// 尝试填入数字 '1' 到 '9'for (char k = '1'; k <= '9'; k++) {// 如果当前填入的数字符合数独规则if (isvalid(board, k, i, j)) {// 填入数字并递归调用回溯函数board[i][j] = k;if (backtrack(board)) return true;// 如果递归调用返回 false,说明填入当前数字不行,回溯到上一步board[i][j] = '.';}}// 如果尝试了所有数字都不行,返回 falsereturn false;}}}// 如果所有格子都已填满,返回 truereturn true;}// 检查当前填入的数字是否符合数独规则boolean isvalid(char[][] board, char c, int row, int col) {// 计算当前格子所在的 3x3 宫的左上角的行坐标和列坐标int startRow = row - row % 3;int startCol = col - col % 3;// 检查当前行是否包含目标字符for (int i = 0; i < board.length; i++) {if (board[row][i] == c) return false;}// 检查当前列是否包含目标字符for (int i = 0; i < board.length; i++) {if (board[i][col] == c) return false;}// 检查当前 3x3 宫是否包含目标字符for (int i = startRow; i < startRow + 3; i++) {for (int j = startCol; j < startCol + 3; j++) {if (board[i][j] == c) return false;}}// 如果所有检查都通过,返回 truereturn true;}
}

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

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

相关文章

微服务监控:确保分布式系统的可观察性与稳定性

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 目录 一、前言二、微服务监控的重要性三、关键监控指标四、常用监控工具五、最佳实践六、结论 一、前言 在当前的软件开发领域&a…

const在指针中的作用以及*p在各种写法中分别代表什么含义

const在指针中起固定的作用&#xff0c;在不同的写法中其效果也有所区别&#xff0c;具体如下&#xff1a; 1、int* const p固定的是指针p指向的地址。 2、int const *p固定的是指针p指向地址中储存的内容。 例&#xff1a; 以上操作在编译器中执行不了&#xff0c;会报错。…

项目中预览图片时,添加水印,浏览器禁止右键功能、前端禁止直接获取图片地址。(Vue3、TS、canvas)

在src/utils文件夹下新建watermark.ts&#xff0c;写入以下代码块&#xff0c;生成水印文件 // 导出函数 getWatermark&#xff0c;它返回一个对象&#xff0c;其中包含一个名为 watermark 的方法。 export const getWatermark () > {const setWatermark (str: any) >…

Java基础知识总结(29)

Java虚拟机 运行时数据区 程序计数器 方法区&#xff1a;Java 8以后没有方法区&#xff0c;改为了元空间&#xff08;MetaSpace&#xff09; 虚拟机栈 堆 本地方法栈 程序计数器 它可以看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里&#xff0c…

flutter生成二维码并截图保存到图库

引入库&#xff1a;flutter_screenutil、image_gallery_saver、qr_flutter弹窗布局 import dart:async; import dart:typed_data; import package/generated/l10n.dart; import package:jade/configs/PathConfig.dart; import package:jade/utils/ImageWaterMarkUtil.dart; im…

瑞吉外卖实战学习--8、人员禁用和启用

前言 1、通过前端页面查看接口 会发现请求方式是put 请求接口是employee 2、检查页面传值 根据浏览器的请求可以看到传值为id和status 2、写put请求&#xff0c;添加修改时间和修改人的id然后传回给后台 /*** 启用和禁用员工账号* param request* param employee* return…

【Consul】Linux安装Consul保姆级教程

【Consul】Linux安装Consul保姆级教程 大家好 我是寸铁&#x1f44a; 总结了一篇【Consul】Linux安装Consul保姆级教程✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 今天要把编写的go程序放到linux上进行测试Consul服务注册与发现&#xff0c;那怎么样才能实现这一过程&am…

25Ramdisk 启动模式简介

Ramdisk 启动模式简介 ramdisk是一种虚拟磁盘技术,我们的PE系统几乎都是使用ramdisk方式从计算机启动的.那么,ramdisk有哪些特点呢? Ramdisk 将内存虚拟为一个磁盘 Ramdisk技术会将你的一部分内存虚拟成一块磁盘分区.使用U盘启动pe系统时,打开pe系统里的文件资源管理器,你会看…

CKS之安全沙箱运行容器:gVisor

目录 一、gVisor介绍 二、gVisor架构 三、gVisor使用前置条件 四、Docker中使用gVisor 五、containerd中使用gVisor 六、Kubernetes结合gVisor使用 一、gVisor介绍 gVisor是Google开源的一种容器沙箱技术&#xff0c;其设计初衷是在提供较高安全性的同时&#xff0c;尽量…

Stable Diffusion 推荐硬件配置和本地化布署

Stable Diffusion简介 Stable Diffusion是由Stability AI开发的一种强大的文本到图像(Text-to-Image)生成模型,它能够根据用户提供的文本描述,生成与之相关的高质量、高分辨率图像。下面我从原理、特点、应用三个方面对Stable Diffusion作简要介绍: 1、原理:Stable Diffusion…

从输入url到页面展示的过程

唠唠叨&#xff1a;我不想误人子弟&#xff0c;我这篇算是搬运工&#xff0c;加上自己的理解做点总结&#xff0c;所以还请大家科学上网去看这篇&#xff1a;https://aws.amazon.com/cn/blogs/mobile/what-happens-when-you-type-a-url-into-your-browser/ 是这六个步骤&#…

杰发科技——Jlink插件使用

0. 简介 杰发自带的烧录工具是ATCLink&#xff0c;基于DapLink适配。个人不太喜欢ATCLink&#xff0c;推荐使用Jlink&#xff0c;毕竟自己买&#xff0c;不用问原厂要&#xff0c;而且带Jlink&#xff0c;至少5Mhz以上。 V9烧录器使用7.50以下版本驱动。 V11烧录器可以使用7…

热烈祝贺阿里云PolarDB登顶2024最新一期中国数据库流行榜

热烈祝贺阿里云PolarDB登顶2024最新一期中国数据库流行榜 墨天轮墨天轮国产数据库流行度排行PolarDB首度夺魁关于话题的讨论数据库流行度排行榜会影响你的数据库选型吗&#xff1f;对于 PolarDB 的本次登顶&#xff0c;你认为关键因素是什么&#xff1f;PolarDB“三层分离”新版…

【Review】小米汽车发布会

动力方面 顶配双电机四驱&#xff0c;小米超级电机21000转&#xff0c;最大马力673ps&#xff0c;峰值功率495kW&#xff0c;峰值扭矩838N.m。风阻系数最低0.195&#xff0c;零百加速最快2.78秒&#xff0c;时速最高265km/h。 底盘方面 前双叉臂&#xff0c;后无五连杆&#xf…

springcloud第4季 远程调用openfegin的介绍4

一 openfegin的介绍 1.1 openfegin的介绍 openfegin是一个声明式的web客户端&#xff1b;只需要创建一个rest接口并在该接口上添加注解FeginClient即可。openfeign基本上就是当前微服务之间调用的事实标准。 openfeign同时还集成了sprigcloud loadbalance。

01-XML-01认识XML

XML 被设计出来用于数据的记录和传递&#xff0c;经常被作用为配置文件 什么是XML 可扩展标记语言&#xff08;Extensible Markup Language&#xff09;,没有固定的标签&#xff0c;所有的标签都可以自定义。使用简单的标记来描述数据通常&#xff0c;xml被用于信息的记录和传…

An Interview

What is your experience with Python and MySQL? Can you provide examples of projects you have worked on using these technologies? How would you handle customer requirements gathering and analysis? Can you provide an example of how you have translated cu…

C++—vector的介绍及使用 vector的模拟实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 一、vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.4 vecto…

20240323-1-条件随机场面试题CRF

条件随机场面试题 1. 简单介绍条件随机场 条件随机场&#xff08;conditional random field&#xff0c;简称 CRF&#xff09;是给定一组输入随机变量条 件下另一组输出随机变量的条件概率分布模型&#xff0c;其特点是假设输出随机变量构成马尔可夫随机场&#xff0c;是一种鉴…

【C语言】贪吃蛇【附源码】

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 一、游戏说明&#xff1a; 一个基于C语言链表开发的贪吃蛇游戏&#xff1a; 1. 按方向键上下左右&#xff0c;可以实现蛇移动方向的改变。 2. 短时间长按方向键上下左右其中之一&#xff0c;可实现蛇向该方向的短时间…