Leetcode 37 解数独

题意理解

        填充数独。每个九宫格内,9个数字各出现一个次,每行,每列上,9个数字各出现一次。数独部分空格内已填入了数字,空白格用 '.' 表示。

        这道题要比N皇后问题更难:

        N皇后只放置N个皇后的位置,但是数独需要填满整个结构。

        N皇后每个位置只有放与不放两种状态,但是数独每个位置都有1-9个选择。

        所以我们不止要遍历数独上的每个位置,还要遍历1-9的数字,以保证在合适的位置放上合适的数字。

        

图摘自《代码随想录》

解题思路

        N皇后、数独问题,都可以使用回溯法来解决。

        其实都是可以将问题解决看作一个一个步骤,前一个步骤会对后一个步骤产生影响,且每个步骤都有n个选择。这是一大类问题。

        所以仍旧可以将其解决方案抽象为一个树结构。

        

图摘自《代码随想录》

1.暴力回溯+剪枝优化

前提条件:判断该位置填某数字是否合法

这与寻找N皇后合法的摆放位置不同,我们只要求得将数独填完得唯一解即可,所以这里我们用到的回溯方法可以设置返回值。

第一个for循环遍历每一行

第二个for函数相当于遍历每一个行的每一个位置。

由于每个位置又有1-9的选择,所以还需要一个for循环来控制数字选择——选择到正确值则向下递归,要么找到正确解,要么找不到。

某位置找不到正确解时,board状态向上回溯——return false。

回溯的三个步骤:确定返回值和参数列表:有返回值,指示是否能获得唯一的解。

                             确定终止条件:找到唯一解即终止。

                             确定单层递归逻辑:递归的目的是找到满足条件的唯一解。

 public void solveSudoku(char[][] board) {backtracking(board);}//回溯求唯一解public boolean backtracking(char[][] board){//终止条件,找到唯一解时即返回//遍历该行的每一个位置for(int rowIndex=0;rowIndex<board.length;rowIndex++){for(int colIndex=0;colIndex<board.length;colIndex++){//是否需要填数字if(board[rowIndex][colIndex]!='.') continue;//控制数字选择for(char num='1';num<='9';num++){//判断填入该数字是否合法if(isValid(board,rowIndex,colIndex,num)){board[rowIndex][colIndex]= num;boolean result=backtracking(board);if(result==true) return true;board[rowIndex][colIndex]= '.';}}//换了9个数字都没有return true,则额说明这样下去找不到合适解return false;}}return true;}//判断在board的( rowIndex, colIndex)填入num是否合法public boolean isValid(char[][] board,int rowIndex,int colIndex,char num){//行判断for(int j=0;j<board.length;j++) if(board[rowIndex][j]==num) return false;//列判断for(int i=0;i<board.length;i++) if(board[i][colIndex]==num) return false;//九宫格判断int startI=Math.floorDiv(rowIndex,3)*3,startJ=Math.floorDiv(colIndex,3)*3;//九宫格左上角起始位置for(int i=0;i<9;i++){//遍历九宫格的9个位置if(board[startI+Math.floorDiv(i,3)][startJ+i%3]==num) return false;}return true;}

2.分析

时间复杂度:O(9^{9\times 9})

空间复杂度:O(9×9)

        作为一个数独,最大9行,9列,共81个格子

        每个格子有1-9的选择

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

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

相关文章

【Unity自动寻路】使用Navigation系统实现物体自动寻路绕开障碍物

知识点流程图 自动导航Navigation系统 我们在游戏场景中经常会有一些障碍物、墙壁、树木等等&#xff0c;如果我想要让角色或者怪物去墙的另一边&#xff0c;我直接在墙另一边点击左键&#xff0c;我希望角色自动跑过去&#xff0c;但是他不能直接穿透墙&#xff0c;他需要“智…

计算机服务器中了mkp勒索病毒怎么办,mkp勒索病毒解密恢复

在计算机技术飞速发展的今天&#xff0c;越来越多的企业走向了数字化办公模式&#xff0c;极大地方便了企业的生产运营&#xff0c;为企业带来了更高的效率。但网络威胁无处不在&#xff0c;网络威胁手段随着计算机技术的不断发展也在不断增加。近期&#xff0c;云天数据恢复中…

✺ch3——数学基础

目录 3D坐标系和点矩阵单位矩阵转置矩阵逆矩阵逆转置矩阵矩阵的运算矩阵加法()矩阵乘法() 常用的变换矩阵平移矩阵缩放矩阵旋转矩阵透视矩阵正射投影矩阵LookAt矩阵 向量加法和减法点积叉积 局部空间和世界空间——模型矩阵M视觉空间和合成相机——模型-视图矩阵MV用GLSL函数构…

代码随想Day39 | 62.不同路径、63. 不同路径 II

62.不同路径 每次向右或者向下走两个选择&#xff0c;定义dp数组dp[i][j] 为到达索引ij的路径和&#xff0c;状态转移公式为 dp[i][j]dp[i-1][j]dp[i][j-1]&#xff0c;初始状态的第一行和第一列为1&#xff0c;从左上到右下开始遍历即可。详细代码如下&#xff1a; class Sol…

EM(Expectation-Maximum)算法

EM算法 简介 EM算法的核心分为两步 E步&#xff08;Expection-Step&#xff09;M步&#xff08;Maximization-Step&#xff09; 因为在最大化过程中存在两个参量 r , θ r,\theta r,θ&#xff0c;其中若知道 r r r&#xff0c;则知道 θ \theta θ&#xff1b;若知道 θ \…

python的安装包安装教程,python怎么安装工具包

本篇文章给大家谈谈python的安装包安装教程&#xff0c;以及python怎么安装工具包&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收藏本站喔。 非商业转载&#xff0c;来自简书-虞大胆的叽叽喳喳-杰作的&#xff1a;在Python中安装包的三种方法 - 简书 最近一段时间都在学…

C语言数据结构-----二叉树(3)二叉树相关练习题

前言 前面详细讲述了二叉树的相关知识&#xff0c;为了巩固&#xff0c;做一些相关的练习题 文章目录 前言1.某二叉树共有 399 个结点&#xff0c;其中有 199 个度为 2 的结点&#xff0c;则该二叉树中的叶子结点数为&#xff1f;2.下列数据结构中&#xff0c;不适合采用顺序存…

【数据分析之Numpy】Numpy中复制函数numpy.repeat()与numpy.tile()的使用方法及区别

一、简介 numpy.repeat()与numpy.tile()都是Numpy库中的复制函数&#xff0c;用于将数组中的元素重复指定的次数。 numpy.repeat()函数接受三个参数&#xff1a;要重复的数组、重复的次数和重复的轴。 numpy.tile()函数接受两个参数&#xff1a;要重复的数组和重复的次数。 二…

mipi dsi协议DBI/DPI接口

MIPI dsi协议中的DBI/DPI接口主要用于主机和display设备之间的数据传输&#xff0c;说的更通俗一点就是DSI RX控制器和实际的显示面板之间的接口&#xff1b;dsi 协议spec中对DBI/DPI有描述&#xff1a; DSI协议中对DBI 接口模式命名为command mode operation&#xff0c;对DP…

动态加载库

no_mangle 不要改标识符 首先是认识这个标注&#xff1a;mangle&#xff0c;英文的含义“撕裂、碾压”。我第一次把这个单次误以为是manage&#xff0c;说实话两个单词还挺像的。 RUS中函数或静态变量使用#[no_mangle]这个标注属性后&#xff0c;编译器就不会修改它们的名字了…

数据分析为何要学统计学(10)——如何进行比率检验

比率检验是通过样本推测某种事件的总体占比水平。要求事件仅有互斥的两种情况&#xff0c;即&#xff0c;概率分别为p与1-p。 比率检验分单样本和双样本两种情况&#xff0c;以下我们分别介绍。 1. 单样本比率检验 形如这样的问题&#xff1a;“小学生近视比例日益提高&#…

C# WPF上位机开发(知识产权ip保护)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 上位机软件如果是和硬件模块搭配开发&#xff0c;这个时候大部分上位机基本上都是白送的&#xff0c;不会收取相关的费用。但是&#xff0c;如果上…