leetcode刷题日记-滑铁卢了家人们(解数独)

问题描述

在这里插入图片描述

解题思路

看到这个题,给我的感觉是什么玩意啊!仔细读题之后,真的没想到解题思路。然后看了题解,用到了回溯算法,感觉这个回溯和N皇后的问题差不太多。然后就照着思路尝试理解了一遍,感觉这种题目前针对我来讲的话,确实算是困难的题目。看来还是要学学回溯算法。思路根据代码理解。整体思路如下。
在 dfs 方法中,pos 表示当前处理的位置。如果 pos 等于 spaces 的长度,说明所有空格都已经填充完毕,将 valid 标记为 True 并返回。

获取当前空格的坐标 (i, j),然后尝试填充数字。对于每个数字(0 到 8),检查该数字是否可以填充到当前位置。如果满足条件,则标记该数字已被使用,更新数独表格,并继续下一个空格的填充。

在递归填充下一个空格之前,需要将之前的标记复原,以便在不同的分支中尝试不同的数字。

如果 valid 已经为 True,则表示已找到解,直接返回。

初始化 line、column 和 block 三个二维数组,用于记录每行、每列和每个 3x3 的块中数字的使用情况。

将数独表格中已有的数字标记为已使用,并将空格的坐标保存到 spaces 列表中。

调用 dfs(0) 开始填充数独表格。
通过深度优先搜索的方式尝试填充数独表格,同时通过回溯的方式处理不合法的填充,直到找到合法的解或者遍历完所有可能的情况。

代码如下


class Solution:
    def solveSudoku(self, board: List[List[str]]) -> None:
        def dfs(pos: int):
            nonlocal valid
            if pos == len(spaces):
                valid = True
                return
            
            i, j = spaces[pos]
            for digit in range(9):
                if line[i][digit] == column[j][digit] == block[i // 3][j // 3][digit] == False:
                    line[i][digit] = column[j][digit] = block[i // 3][j // 3][digit] = True
                    board[i][j] = str(digit + 1)
                    dfs(pos + 1)
                    line[i][digit] = column[j][digit] = block[i // 3][j // 3][digit] = False
                if valid:
                    return
            
        line = [[False] * 9 for _ in range(9)]
        column = [[False] * 9 for _ in range(9)]
        block = [[[False] * 9 for _a in range(3)] for _b in range(3)]
        valid = False
        spaces = list()

        for i in range(9):
            for j in range(9):
                if board[i][j] == ".":
                    spaces.append((i, j))
                else:
                    digit = int(board[i][j]) - 1
                    line[i][digit] = column[j][digit] = block[i // 3][j // 3][digit] = True

        dfs(0)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电脑怎么解除安全模式?

安全模式是windows系统中的一种特殊模式,在安全模式可以让系统仅载入最低需求的驱动程序来启动电脑,用户可以在此模式下检测或故障排除。可是一些用户却不知道怎么解除安全模式。下面,极客狗就为大家带来电脑怎么解除安全模式的方法吧。 解除安全模式的方法: 1、 首先,在安…

Python使用flask框架与前端建立websocket链接,并进行数据交互

Python使用flask框架与前端建立websocket链接,并进行数据交互 后端采用的框架为flask,前端用的flask自带的html编写,实现的功能为:前后端建立websocket链接并进行数据交互 一、编写一个flask后端服务 常规创建方式就可以,创建一个flask服务。声明一个websocket实例,以we…

详解mysql安装与配置,及Mac中常见的安装问题

目录 1 数据库介绍 什么是数据库 数据库分类 2 MySQL服务器安装 2.1 Windows绿色安装 2.2 Windows中重装MySQL 3 Mac中常见的安装问题 4 客户端连接MySQL服务器 5 SQL分类 1 数据库介绍 什么是数据库 存储数据用文件就可以了,为什么还要弄个数据库? 文件…

文件上传一-WEB攻防-PHP应用文件上传函数缺陷条件竞争二次渲染黑白名单JS绕过9

演示案例: PHP-原生态-文件上传-前后端验证PHP-原生态-文件上传-类型文件头验证PHP-原生态-文件上传-后缀黑白名单验证PHP-原生态-文件上传-解析配置&二次渲染PHP-原生态-文件上传-逻辑缺陷&函数缺陷 #学习前必读: 1、课前一定要明白&#xff1a…

【教程】高效数据加密混淆方法及实现简介

背景 在需要对数据进行传输或者表达时,通常要求数据加密的安全级别不高,但希望加解密时间复杂度尽可能低。这时使用传统的对称加密(如3DES、AES)或非对称加密(如RSA、ECC)显然不太适合。因为加密的安全级别…

PSO-CNN-BiLSTM多输入时序预测|粒子群优化算法-卷积-双向长短期神经网络时序预测|Matlab

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、算法介绍: 四、完整程序下载: 一、程序及算法内容介绍: 基本内容: 本代码基于Matlab平台编译&am…

Linux manim安装

ERROR No package ‘pangocairo’ found Getting requirements to build wheel ... errorerror: subprocess-exited-with-error Getting requirements to build wheel did not run successfully.│ exit code: 1╰─> [31 lines of output]Package pangocairo was not fou…

青少年扁平足也需要手术?家长可千万不要忽视!

近日,在门诊遇到一位年轻妈妈带着孩子来看诊,反应孩子从一年前体育活动时就莫名喊双脚疼,长时间走路或者站立疼痛会加重,休息了就好些,担心孩子脚是不是有什么问题。医生听了先给孩子做了查体,后又让孩子脱…

基于ArUco码测量蓝色区域长度

基于ArUco码测量蓝色区域长度 ,并把各个参数画在图上

【郭林保大夫】——这些事情做到了,想患上帕金森都难!

郭林保大夫说:帕金森病的发病原因尚不完全清楚,但可能与多种因素有关,包括遗传因素、环境因素、神经系统老化等。具体病因可能是这些因素相互作用的结果。病情后期,严重程度会因个体差异而异。一些患者可能出现严重的运动障碍&…

JVM系列之JVM体系(一)

一、前言 为什么要学习了解Java虚拟机 1.我们需要更加清楚的了解Java底层是如何运作的,有利于我们更深刻的学习好Java。 2.对我们调试错误提供很宝贵的经验。 3.这是合格的Java程序必须要了解的内容。 基于此,我打算出一个Java虚拟机的系列&#xf…

电脑哥的励志创业路:蹭别人的电脑做抖店

我是王路飞。 没有一步到位的创业项目,也没有一击必中的解决方法,有的只是需要时刻解决的当下问题。 做事/创业/成长/生活/人生,都不要追求百分百的圆满,不要抱有一帆风顺的幻想,不要期待十全十美的结果。 它们的第…

windows一键快速安装python方法

正常我们安装python的时候,需要先去下载python压缩包,然后再一步步安装,今天发现一个windows10下,一键安装python的方法; 电脑环境:windows10以上 安装方法: 0:在应用商店搜索pyt…

OpenHarmony使用智能指针管理动态分配内存对象

概述 智能指针是行为类似指针的类,在模拟指针功能的同时提供增强特性,如针对具有动态分配内存对象的自动内存管理等。 自动内存管理主要是指对超出生命周期的对象正确并自动地释放其内存空间,以避免出现内存泄漏等相关内存问题。智能指针对…

【数据结构取经之路】队列循环队列

目录 引言 队列的性质 队列的基本操作 初始化 判空 销毁 队列的长度 插入 删除 返回队头元素 循环队列 假溢出 空与满的判定 实现 初始化 插入 判空 销毁 删除 返回队列长度 返回队列头元素 判满 引言 队列和栈一样,也是数据结构的一种&…

python初级2条件与循环笔记

两个课堂小练习: 1、(计算圆柱体的体积) 编写一个读取圆柱的半径和高并利用公式计算圆柱体底面积和体积的程序 iimport math reval(input("enter the r")) heval(input("enter the h")) arear*r*math.pi print("the area ",area,…

java 三元搜索 - 迭代与递归(Ternary Search)

计算机系统使用不同的方法来查找特定数据。有多种搜索算法,每种算法更适合特定情况。例如,二分搜索将信息分为两部分,而三元搜索则执行相同的操作,但分为三个相等的部分。值得注意的是,三元搜索仅对排序数据有效。在本…

SELinux详解

文章目录 SELinux详解什么是SELinux当初设计的目标:避免资源的误用传统的文件权限与账号主要的关系:自主访问控制(DAC)以策略规则制定特定进程读取特定文件:强制访问控制(MAC) SELinux的运行模式安全上下文进程与文件SELinux类型字段的相关性…

代码随想录算法训练营第五十一天|309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费、股票问题总结

309.最佳买卖股票时机含冷冻期 刷题https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/description/文章讲解https://programmercarl.com/0309.%E6%9C%80%E4%BD%B3%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E6%97%B6%E6%9C%BA%E5%90%AB%E5%86%B7%E5%8…

java第一次作业(二)

先写思路,再写代码,思路清晰,才能写对代码 7-6 求12...n的和 思路: 运用expression的字符串输出 重点: expression输出 代码: import java.util.Scanner; public class Main {public static void main…