解数独(Java)

news2024/9/24 2:35:15

题目链接:

力扣

题目详情:

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

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

  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] 是一位数字或者 '.'
  • 题目数据 保证 输入数独仅有一个解

思路:

我们使用三个boolean数组,多开一个位置让下标与数字映射

rowCheck = new boolean[9][10];

colCheck = new boolean[9][10];

check = new boolean[3][3][10];

  • boolean[][] rowCheck,用来表示某一行是否能填写某个数字:比如rowCheck[3][4]就表示下标为3这一行是否存在4这个数字,如果为false,就表示不存在
  • boolean[][] colCheck;同上,表示某一列是否能填写某个数字
  • boolean[][][] check;用来表示某一个小方块是否能填写某个数字,像下面这样把数度分为九个小方块,我们可以使用横坐标以及纵坐标/3的值来表示具体是哪个方块,比如下标为【3】【3】就可以使用check[3/1][3/1]来表示,那么check[3/1][3/1][4]就用来表示第一个小方块中是否存在4这个数字

确定好了Boolean数组的表示含义,我们就可以来写代码了,在写代码之前,我们需要先遍历数独中写好的数据,修改我们的Boolean数组,代码如下:

for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (board[i][j] != '.') {
                    int num = board[i][j] - '0';
                    rowCheck[i][num] = colCheck[j][num] = check[i/3][j/3][num] = true;
                }
            }
        }

这样在调用我们写的dfs(char[][] board)方法,

完整代码(有详细注释):

class Solution {
    boolean[][] rowCheck, colCheck;
    boolean[][][] check;

    public void solveSudoku(char[][] board) {
        rowCheck = new boolean[9][10];
        colCheck = new boolean[9][10];
        check = new boolean[3][3][10];
        // 遍历数独初始化Boolean数组
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (board[i][j] != '.') {
                    int num = board[i][j] - '0';
                    rowCheck[i][num] = colCheck[j][num] = check[i/3][j/3][num] = true;
                }
            }
        }
        dfs(board);
    }
    public boolean dfs(char[][] board) {
        for (int row = 0; row < 9; row++) {
            for (int col = 0; col < 9; col++) {
                // 如果等于'.'说明需要填写数字
                if (board[row][col] == '.') {
                    // 遍历数字1-9,选取合适的
                    for (int num = 1; num < 10; num++) {
                        // 如果行列以及所处小方块都不存在当前的数字,说明可以放
                        if (!rowCheck[row][num] && !colCheck[col][num] && !check[row/3][col/3][num]) {
                            // 修改当前的数字
                            board[row][col] = (char)(num+'0');
                            // 修改当前行列以及小方块的Boolean值
                            rowCheck[row][num] = colCheck[col][num] = check[row/3][col/3][num] = true;
                            // 如果接下来返回的为true,说明当前选择是正确的
                            if (dfs(board)) {
                                return true; 
                            } else {
                                // 否则说明选择错误,就需要回溯到指定的位置,重新进行选择
                                board[row][col] = '.';
                                // 修改Boolean值回到初始状态
                                rowCheck[row][num] = colCheck[col][num] = check[row/3][col/3][num] = false;
                            }
                        }
                    }
                    // 走到这里说明数字1-9一个也不能填,直接返回false
                    return false;
                }
            }
        }
        //两层循环都走完说明数独全部填完,返回true
        return true;
    }
}

 

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

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

相关文章

研发工程师玩转Kubernetes——使用emptyDir在同一Pod不同容器间共享数据

kubernets可以通过emptyDir实现在同一Pod的不同容器间共享文件系统。 正如它的名字&#xff0c;当Pod被创建时&#xff0c;emptyDir卷会被创建&#xff0c;这个时候它是一个空的文件夹&#xff1b;当Pod被删除时&#xff0c;emptyDir卷也会被永久删除。 同一Pod上不同容器之间…

【数据分析】pandas (三)

基本功能 在这里&#xff0c;我们将讨论pandas数据结构中常见的许多基本功能 让我们创建一些示例对象&#xff1a; index pd.date_range(“1/1/2000”, periods8) s pd.Series(np.random.randn(5), index[“a”, “b”, “c”, “d”, “e”]). df pd.DataFrame(np.random.…

BDA初级分析——界定问题

数据分析&#xff0c;从界定问题开始 一、界定问题的作用 如何从现有台式机企业客户中挑选出那些想购买服务器的企业客户&#xff1f; 问题中的陷阱&#xff0c;隐藏的假设条件 假设1: 在购买服务器的客户中&#xff0c;只有0.01%的客户是购买过公司台式机的客户&#xff0…

超详细的Linux基础命令

文章目录 前言Linux目录结构Linux命令通用格式ls 命令什么是工作目录什么是 HOME 目录 目录切换相关命令cd 命令pwd 命令 特殊的路径符创建目录文件操作相关命令touch 命令cat 命令more 命令cp 命令mv 命令rm 命令通配符 查找命令which 命令find 命令按文件名查找文件按文件大小…

无人驾驶实战-第十一课(控制理论)

在七月算法上报了《无人驾驶实战》课程&#xff0c;老师讲的真好。好记性不如烂笔头&#xff0c;记录一下学习内容。 课程入口&#xff0c;感兴趣的也可以跟着学一下。 ————————————————————————————————————————— 无人驾驶中控制系…

1、如何实现两台电脑之间数据相互读写

一、确保两台电脑在同一个局域网中&#xff0c;可以使用网线【动态配置】进行两台电脑互连。 二、静态配置: 将IP地址和网关设为192.168.0.1&#xff0c;目的是让这台电脑做另一台电脑的网关&#xff0c;子网掩码一点击会自动添加。第二台电脑同样打开设置&#xff0c;此处IP地…

[oeasy]python0082_[趣味拓展]控制序列_清屏_控制输出位置_2J

光标位置 回忆上次内容 上次了解了键盘演化的过程 ESC 从 组合键到 独立按键 ESC的作用 是 进入 控制序列配置 控制信息控制信息 \033[y;xH 设置光标位置\033[2J 清屏 这到底怎么控制&#xff1f;&#xff1f;&#xff1f;&#x1f914;谁来实现这些功能&#xff1f; 控制…

【大数据】Flink 详解(二):核心篇 Ⅱ

Flink 详解&#xff08;二&#xff09;&#xff1a;核心篇 Ⅱ 22、刚才提到 State&#xff0c;那你简单说一下什么是 State。 在 Flink 中&#xff0c;状态 被称作 state&#xff0c;是用来保存中间的计算结果或者缓存数据。根据状态是否需要保存中间结果&#xff0c;分为 无状…

【Linux】网络基础1

文章目录 网络基础11. 计算机网络背景1.1 网络发展 2. 认识协议2.1 网络协议2.2 OSI七层模型2.3 TCP/IP五层&#xff08;或四层&#xff09;模型 3. 网络传输基本流程3. 1 数据报封装和分用 4. 网络中的地址管理4.1 认识IP地址 5. 认识MAC地址 网络基础1 1. 计算机网络背景 1…

(番外篇)Michael.W基于Foundry精读Openzeppelin第22期——内联汇编staticcall

&#xff08;番外篇&#xff09;Michael.W基于Foundry精读Openzeppelin第22期——内联汇编staticcall 0. 版本1. 关于内联汇编staticcall2. foundry代码验证2.1 目标合约2.2 返回数据字节长度为322.3 返回数据字节长度为642.4 返回数据为动态数组 0. 版本 [forge-std]&#xf…

腾讯云COS的快速接入

背景 最近在研究一个剪贴板粘贴工具&#xff0c;实现粘贴图片&#xff0c;返回可访问的地址&#xff0c;这个在我的哔哩哔哩上有出一期视频&#x1f92d;。但是&#xff0c;我发现部分博客平台不能正常的转载我的图片链接&#xff0c;于是研究了一下腾讯云的COS&#xff08;阿…

MySQL数据库面试题:如何优化呢?

文章目录 优化字段类型的选择优化索引的使用优化SQL语句事务与隔离级别并发事务的问题与解决undo log和redo log的区别事务的隔离性与MVCCMySQL主从同步原理分库分表的经验水平分库的应用 在数据库开发中&#xff0c;创建表是一个至关重要的步骤&#xff0c;优化设计可以显著提…

【非欧几里得域信号的信号处理】使用经典信号处理和图信号处理在一维和二维欧几里得域信号上应用低通滤波器研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

遍历集合List的五种方法以及如何在遍历集合过程中安全移除元素

一、遍历集合List的五种方法 测试数据 List<String> list new ArrayList<>(); list.add("A");list.add("B");list.add("C");1. 普通for循环 普通for循环&#xff0c;通过索引遍历 for (int i 0; i < list.size(); i) {Syst…

《UNUX环境高级编程》(14)高级I/O

1、引言 2、 非阻塞I/O 系统调用分为两类&#xff1a;低速系统调用和其他系统调用。低速系统调用是可能会使进程永远阻塞的一类系统调用&#xff0c;包括&#xff1a; 如果某些文件类型&#xff08;如读管道、终端设备和网络设备&#xff09;的数据并不存在&#xff0c;读操作…

国产低功耗蓝牙HS6621CxC/6621Px系列支持Find My网络功能方案芯片

目录 什么是“Find My“&#xff1f;HS6621系列简介 什么是“Find My“&#xff1f; “Find My”是苹果公司于19年前推出的针对失物追踪&#xff0c;Find My iPhone&#xff08;查找我的iPhone&#xff09;和Find My Friends&#xff08;查找朋友&#xff09;的结合体应用。为…

【CSS3】CSS3 动画 ④ ( 使用动画制作地图热点图 )

文章目录 一、需求说明二、动画代码分析1、地图背景设置2、热点动画位置测量3、热点动画布局分析4、动画定义5、小圆点实现6、波纹效果盒子实现7、延迟动画设置 三、代码示例 一、需求说明 实现如下效果 , 在一张地图上 , 以某个位置为中心点 , 向四周发散 ; 核心 是实现 向四周…

go-zero 是如何做路由管理的?

原文链接&#xff1a; go-zero 是如何做路由管理的&#xff1f; go-zero 是一个微服务框架&#xff0c;包含了 web 和 rpc 两大部分。 而对于 web 框架来说&#xff0c;路由管理是必不可少的一部分&#xff0c;那么本文就来探讨一下 go-zero 的路由管理是怎么做的&#xff0c…

速卖通,国际站店铺想要增加曝光,提升销量,测评补单有效果吗?

作为一个卖家&#xff0c;成功运营速卖通店铺需要一系列的策略和技巧 1.借助平台的力量对于成长期的店铺来说&#xff0c;平台本身是最大的流量来源。如何从平台那儿获取更多的支持则成为这个阶段最重要的难题。以速卖通为例&#xff0c;经过反复测试&#xff0c;平台给普通卖家…

LeetCode练习习题集【4月 - 7 月】

LEETCODE习题集【4月-7月总结】 简单 数组部分 1.重复数 题目&#xff1a; 在一个长度u为 n 的数组 nums 里的所有数字都在 0&#xff5e;n-1 的范围内。数组中某些数字是重复的&#xff0c;但不知道有几个数字重复了&#xff0c;也不知道每个数字重复了几次。请找出数组中…