【LeetCode 刷题】回溯算法(5)-棋盘问题

devtools/2025/2/6 12:41:44/

此博客为《代码随想录》二叉树章节的学习笔记,主要内容为回溯算法棋盘问题相关的题目解析。

文章目录

  • 51. N皇后
  • 37. 解数独
  • 332.重新安排行程

51. N皇后

题目链接

python">class Solution:def solveNQueens(self, n: int) -> List[List[str]]:board = [['.' for _ in range(n)] for _ in range(n)]res = []def check(x: int, y: int) -> bool:for i in range(x):if board[i][y] == 'Q':  # 列return Falseif y - (x - i) >= 0 and board[i][y-(x-i)] == 'Q':  # 45对角线return Falseif y + (x - i) < n and board[i][y+(x-i)] == 'Q':  # -45对角线return Falsereturn Truedef dfs(row: int) -> None:if row == n:res.append([''.join(row) for row in board])returnfor col in range(n):if check(row, col):board[row][col] = 'Q'dfs(row + 1)board[row][col] = '.'dfs(0)return res
  • dfs 函数的参数为行号,即“第 row 行选哪一列放皇后”构成递归树的一层
  • 判断合法性时,不需要判断行是否合法,因为上述解法递归的逻辑即为每一行选择一列去放皇后,所以行约束肯定满足;且判断时只需要判断当前行 x 以上的合法性,因为下面的行还没有放皇后,肯定不会冲突

37. 解数独

题目链接

python">class Solution:def solveSudoku(self, board: List[List[str]]) -> None:"""Do not return anything, modify board in-place instead."""def check(x: int, y: int, num: str) -> bool:for i in range(9):if board[i][y] == num:return Falsefor i in range(9):if board[x][i] == num:return Falserow_s, col_s = x // 3 * 3, y // 3 * 3for i in range(3):for j in range(3):if board[row_s+i][col_s+j] == num:return Falsereturn Truedef dfs() -> bool:for i in range(9):for j in range(9):if board[i][j] == '.':for num in range(1, 10):if check(i, j, str(num)):board[i][j] = str(num)if dfs(): return Trueboard[i][j] = '.'return Falsereturn Truedfs()return
  • 数独的 check 函数需要检查整个棋盘,而非当前行列之前的内容
  • 当找到一个解时,直接返回 True,之前的递归也不再进行回溯;如果当前位置 1-9 全部遍历也没找到解,则返回 False

332.重新安排行程

题目链接

python">class Solution:def findItinerary(self, tickets: List[List[str]]) -> List[str]:tickets = sorted(tickets, key=lambda x: (x[0], x[1]))graph = {}for u, v in tickets:if u in graph:graph[u].append(v)else:graph[u] = [v]path = ['JFK']def dfs(u, num):if num == 0:return Trueif u not in graph or not graph[u]:return Falseaims = graph[u].copy()for v in aims:graph[u].pop(graph[u].index(v))path.append(v)if dfs(v, num - 1):return Truepath.pop()graph[u].append(v)return Falsedfs("JFK", len(tickets))return path
  • dfs 函数的参数分别为:当前站点,以及还有几站到达终点
  • 首先需要将 tickets 转换为有向图的形式,之后遍历当前点所有可能的下一站点列表,每处理一个站点,从原始列表中移除,回溯时再将站点添加回列表
  • 由于最开始按照字典序升序排列,因此一旦找到一条合法行程,即为满足题目要求的字典序最小的行程,递归函数即可返回;如果当前处理的站点不存在合法的下一站,则回溯。

http://www.ppmy.cn/devtools/156535.html

相关文章

http和https的区别?

文章目录 一、安全性二、连接方式三、端口使用四、证书申请五、优缺点六、SSL&TLS协议6.1、SSL协议6.2、TLS协议6.3、SSL/TLS协议在HTTPS中的应用 总结 HTTP和HTTPS是两种常见的网络传输协议&#xff0c;它们在安全性、连接方式、端口使用以及证书申请等方面存在显著差异。…

【C语言】指针详细解读3

1. 数组名的理解 我们使用指针一般访问数组内容时&#xff0c;我们可能会这样写&#xff1a; int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0]; 这⾥我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址&#xff0c;但是其实数组名本来就是地址&#xff0c;⽽…

React常见状态管理工具详解

了 解React常见的状态管理工具&#xff0c;需要详细解释。首先&#xff0c;我得回想一下React生态中常用的状态管理方案有哪些。React本身有useState和useContext&#xff0c;然后是第三方库比如Redux、MobX、Recoil、Zustand、Jotai、XState&#xff0c;可能还有Valtio。这些工…

Hackmyvm Deeper

简介 难度&#xff1a;简单 靶机&#xff1a;https://hackmyvm.eu/machines/?vdeeper 基本信息 kali&#xff1a;192.168.194.9 靶机&#xff1a;192.168.194.20 扫描 nmap基操 tcp扫描起手&#xff0c;nmap -sT -sV -A -T4 192.168.194.20 -Pn -p- 开启的tcp端口只有ss…

DeepSeek大模型介绍、本地化部署与使用!【AI大模型】

一、DeepSeek 是什么&#xff1f; 1.技术定位 专注大模型与AGI研究&#xff0c;开发高性能基座模型&#xff08;如 DeepSeek LLM 系列&#xff09;&#xff0c;支持长文本、多模态、代码生成等复杂任务。 提供开源模型&#xff08;如 DeepSeek-MoE、DeepSeek-V2&#xff09;…

Web - CSS3浮动定位与背景样式

概述 这篇文章主要介绍了 CSS3 中的浮动定位、背景样式、变形效果等内容。包括 BFC 规范与创建方法、浮动的功能与使用要点、定位的多种方式及特点、边框与圆角的设置、背景的颜色、图片等属性、多种变形效果及 3D 旋转等&#xff0c;还提到了浏览器私有前缀。 BFC规范与浏览…

Vue Dom截图插件,截图转Base64 html2canvas

安装插件 npm install html2canvas --save插件使用 <template><div style"padding: 10px;"><div ref"imageTofile" class"box">发生什么事了</div><button click"toImage" style"margin: 10px;&quo…

RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)

#作者&#xff1a;闫乾苓 文章目录 RabbitMQ简介RabbitMQ与VMware的关系架构工作流程RabbitMQ 队列工作模式及适用场景简单队列模式&#xff08;Simple Queue&#xff09;工作队列模式&#xff08;Work Queue&#xff09;发布/订阅模式&#xff08;Publish/Subscribe&#xff…