leetcode37. 解数独(java)

news2024/11/18 7:51:13

解数独

  • 解数独
    • 题目描述
    • 回溯算法
    • 代码演示
  • 回溯算法

解数独

难度 困难
leetcode37. 解数独

题目描述

编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
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] 是一位数字或者 ‘.’
题目数据 保证 输入数独仅有一个解

回溯算法

这题让我们对给定 board 求数独,由于 board 固定是 9 * 9 的大小,我们可以使用回溯算法去做。
对每一个需要填入数字的位置进行填入,如果发现填入某个数会导致数独解不下去,则进行回溯。

由于我们可以填写的数字范围为 [1,9],而数组的下标从 0 开始,因此在存储时,我们使用一个长度为 9 的布尔类型的数组,其中 i个元素的值为 True,当且仅当数字 i+1出现过。例如我们用 line[2][3]=True表示数字 4在第 2 行已经出现过,那么当我们在遍历到第 2 行的空白格时,就不能填入数字 4。

我们首先对整个数独数组进行遍历,当我们遍历到第 i 行第 j 列的位置:

  1. 如果该位置是一个空白格,那么我们将其加入一个用来存储空白格位置的列表中,方便后续的递归操作;

2.如果该位置是一个数字 x,那么我们需要将 line[i][x−1],column[j][x−1] 以及 block[⌊i/3⌋][⌊j/3⌋][x−1]均置为 True。

当我们结束了遍历过程之后,就可以开始递归枚举。当递归到第 iii 行第 jjj 列的位置时,我们枚举填入的数字 x。根据题目的要求,数字 x 不能和当前行、列、九宫格中已经填入的数字相同,因此 line[i][x−1],column[j][x−1]以及 block[⌊i/3⌋][⌊j/3⌋][x−1] 必须均为 False.

当我们填入了数字 x 之后,我们要将上述的三个值都置为 Tru,并且继续对下一个空白格位置进行递归。在回溯到当前递归层时,我们还要将上述的三个值重新置为 False。

代码演示

class Solution {
    boolean[][]col = new boolean[9][9];
    boolean[][]row = new boolean[9][9];
    boolean[][][]ceil = new boolean[3][3][9];

    /**
     * 解数独
     * @param board
     */
    public void solveSudoku(char[][] board) {
       for (int i = 0;i < 9;i++){
           for (int j = 0;j < 9;j++){
               if (board[i][j] != '.'){
                   int num = board[i][j] - '1';
                   row[i][num] = true;
                   col[j][num] = true;
                   ceil[i / 3][j / 3][num] = true;
               }
           }
       }
       dfs(board,0,0);
    }

    public boolean dfs(char[][]board,int x,int y){
        if (y == 9){
            return dfs(board,x + 1,0);
        }
        if (x == 9){
            return true;
        }
        if (board[x][y] != '.'){
            return dfs(board,x,y + 1);
        }
        for (int i = 0;i < 9;i++){
            if (!row[x][i] && !col[y][i] && !ceil[x / 3][y / 3][i]){
                board[x][y] = (char)(i + '1');
                row[x][i] = true;
                col[y][i] = true;
                ceil[x / 3][y / 3][i] = true;
                if (dfs(board,x,y + 1)){
                    break;
                }else {
                    board[x][y] = '.';
                    row[x][i] = false;
                    col[y][i] = false;
                    ceil[x / 3][y / 3][i] = false;
                }

            }
        }
        return board[x][y] != '.';
    }

}

回溯算法

leetcode301. 删除无效的括号

leetcode22. 括号生成

leetcode17. 电话号码的字母组合

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

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

相关文章

2020-2023中国高等级自动驾驶产业发展趋势研究

1.1 概念界定 2020-2023中国高等级自动驾驶产业发展趋势研究Trends in China High-level Autonomous Driving from 2020 to 2023自动驾驶发展过程中&#xff0c;中国出现了诸多专注于研发L3级以上自动驾驶的公司&#xff0c;其在业界地位也越来越重要。本报告围绕“高等级自动…

如何搭建自动化测试框架?资深测试整理的PO模式,一套打通自动化...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Po模型介绍 1、简…

MCU的类型和应用领域简介

MCU&#xff08;Microcontroller Unit&#xff09;根据存储器类型可分为无片内ROM型和带片内ROM型。无片内ROM型的芯片需要外接EPROM才能应用&#xff0c;而带片内ROM型则有不同的子类型&#xff0c;如片内EPROM型、MASK片内掩模ROM型和片内Flash型。 MCU还可以按照用途分为通…

JavaSE程序逻辑控制(三种基本结构(顺序、分支、循环)、输入输出、循环输入)

目录 一、顺序结构 二、分支结构 1、 if 语句 2、switch 语句 与C语言不同&#xff0c;不能作为switch参数的类型&#xff1a;float double long boolean 三、循环结构 1.while循环 2.for循环 四、输入输出 1.输出 - 将结果显示打印到屏幕上 2.输入 3.输入输出综合…

Java的方法怎么用?递归是什么?一篇文章带你醍醐灌顶

目录 1.方法定义 2.实参 形参 3.方法重载 4.递归 1.方法定义 // 方法定义 修饰符 返回值类型 方法名称([参数类型 形参 ...]){ 方法体代码; [return 返回值]; }public static 返回值 方法名(形式参数列表){} 实现一个函数&#xff0c;检测一个年份是否为闰年 public class M…

从零开始yolov5模型训练【绝对能学会】

与其说是学习目标检测任务&#xff0c;不如暂时说成是如何正确运行一个yolo小项目。 一、anaconda 安装&#xff1a; Anaconda安装以及如何创建新环境 安装好了之后打开Anaconda Prompt&#xff1a; anaconda的base环境下&#xff1a; 针对yolov5创建一个自己的环境&#xff…

Spring指定bean在哪个应用加载

1.背景 某项目,spring架构,有2个不同的WebAppApplication入口,大部分service类共用,小部分类有区别,只需要在一个应用中加载,不需要在另一个应用中加载. 2.实现代码 自定义限制注解 package mis.shared.annotation;import java.lang.annotation.ElementType; import java.lan…

【深度学习_TensorFlow】手写数字识别

写在前面 到这里为止&#xff0c;我们已经学习完张量的常用操作方法&#xff0c;已具备实现大部分神经网络技术的基础储备了。这一章节我们将开启神经网络的学习&#xff0c;然而并不需要像学习前面那样了解大量的张量操作&#xff0c;而是将重点转向理解概念知识&#xff0c;…

SQL92 SQL99 语法 Oracle 、SQL Server 、MySQL 多表连接、Natural 、USING

SQL92 VS SQL 99 语法 92语法 内连接 from table1&#xff0c; table2 where table1.col table2.col 外连接 放在 从表 左连接&#xff1a; from table1&#xff0c; table2 where table1.col table2.col() 右连接&#xff1a; from table1&#xff0c; table2 where table…

全网最全最细的jmeter接口测试教程以及接口测试流程详解

一、Jmeter简介 Jmeter是由Apache公司开发的一个纯Java的开源项目&#xff0c;即可以用于做接口测试也可以用于做性能测试。 Jmeter具备高移植性&#xff0c;可以实现跨平台运行。 Jmeter可以实现分布式负载。 Jmeter采用多线程&#xff0c;允许通过多个线程并发取样或通过…

UE4查看加密PAK里边的资源Android/iOS/PC方法

我们经常会需要把1个模型进行减面然后在移动端使用,有时候会出现移动端模型和PC端模型不一致的问题,这时候就需要将移动端的模型和PC端的模型进行对比,找到问题出现的原因,检查Mesh、Normal、UV0、UV1、MaterialId、碰撞等是否一致。 如何打包Pak文件,见这篇文章:UE4打包…

visio过段时间失效了再次破解

坑&#xff1a;一定要 右键在这个bat上面以管理员身份运行&#xff0c;不要直接运行否则会失败&#xff1b; 还有编码&#xff0c;ANSI编码&#xff01;&#xff01;&#xff01; 如图 参考&#xff1a;

机器学习基础08-模型选择02-分类算法矩阵(基于Pima 数据集)

算法评估矩阵&#xff08;Algorithm Evaluation Metrics&#xff09;用于评估机器学习算法在特定任务上的性能。不同的任务可能会使用不同的评估矩阵&#xff0c;因为每个任务的优劣衡量标准都不同。 分类算法矩阵 分类问题或许是最常见的机器学习问题&#xff0c;并且有多种评…

【Linux】节点之间配置免密登录

文章目录 1、实现2、原理3、SSH的理解 1、实现 先写实现&#xff0c;解决问题后有兴趣的自己看后面的原理。 以实现节点A&#xff08;主&#xff09;免密登录到节点B&#xff08;从&#xff09;为例&#xff1a;&#xff08;注意例子里节点B被登录&#xff09; 步骤一&#xf…

JavaScript 中的隐式类型转换

一、什么情况会发生隐式类型转换&#xff1f; 1、加号&#xff08;&#xff09; 号比较特殊&#xff0c;既可以当做算数运算符做加法&#xff0c;又可以当做字符串连接符 ① 算数运算符 除了 string 类型以外的原始数据类型进行加法运算时&#xff0c;非数字类型会转换为数字…

uniapp对uni.request()的封装以及使用

前言&#xff1a; 在uniapp中向服务端发送请求较为容易&#xff0c;使用 uni.request() 即可。 uni.request({url: https://www.example.com/request, //仅为示例&#xff0c;并非真实接口地址。data: {text: uni.request},header: {custom-header: hello //自定义请求头信息…

weui cells 如何去掉边框

问题&#xff1a;weui cells 如何去掉边框 解决&#xff1a; cells通过before,after实现边框&#xff0c;不显示的话&#xff0c;在引用的页面wxss加上&#xff1a; .weui-cells:before,.weui-cells:after {border: none; }

2023牛客暑期多校训练营6 A-Tree (kruskal重构树))

文章目录 题目大意题解参考代码 题目大意 ( 0 ≤ a i ≤ 1 ) , ( 1 ≤ c o s t i ≤ 1 0 9 ) (0\leq a_i\leq 1),(1 \leq cost_i\leq 10^9) (0≤ai​≤1),(1≤costi​≤109) 题解 提供一种新的算法&#xff0c;kruskal重构树。 该算法重新构树&#xff0c;按边权排序每一条边…

学会这样提问,你就超过了82.7%的老网工

下午好&#xff0c;我的网工朋友 很多朋友会说&#xff0c;我怎么问问题&#xff0c;在群里&#xff0c;或者后台&#xff0c;还有给老杨总发消息&#xff0c;都没收到比较详细的回复&#xff1f;尤其是问技术问题的时候。 除了我们回复消息的时间和精力的确比较有限之外&…

JMeter压力测试记录

最近在学习redis解决高并发下导致数据库数据不准确的问题&#xff0c;使用到了一些工具&#xff0c;包括Jmeter&#xff0c;Redis-desktop-manager.。Jmeter用于模拟高并发情景&#xff0c;Redis-desktop-manager是redis数据库的GUI界面。 一、单元测试生成测试数据 1)插入20…