攀登深度优先搜索之山,《代码来临》第 10 天
时间:2025-01-16 22:58:09 152浏览 收藏
怎么入门文章编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《攀登深度优先搜索之山,《代码来临》第 10 天》,涉及到,有需要的可以收藏一下
深入解析第十天难题:多路径深度优先搜索
第十天难题延续了第六天的二维网格模式,但挑战升级为寻找多条路径。本文将详细阐述如何巧妙运用深度优先搜索算法(DFS)解决此问题。
copilot提供的AI拼图插图
地图用一个字典表示,键为(x, y)坐标,值为该点的高度(0-9,9为峰值)。以下代码实现了地图解析:
def parse(input: str) -> dict[tuple[int, int], int | None]:
return {
(x, y): int(item) if item.isdigit() else None
for y, row in enumerate(input.strip().splitlines())
for x, item in enumerate(row)
}
路径查找规则:每一步高度必须增加1。代码如下:
trail_max = 9
def next_step(
topo_map: dict[tuple[int, int], int | None], x: int, y: int
) -> tuple[tuple[int, int], ...]:
assert topo_map[(x, y)] != trail_max
return tuple(
incoming
for incoming in (
(x + 1, y),
(x, y + 1),
(x - 1, y),
(x, y - 1),
)
if (
isinstance(topo_map.get(incoming), int)
and isinstance(topo_map.get((x, y)), int)
and (topo_map[incoming] - topo_map[(x, y)] == 1)
)
)
起点(高度为0的点)的查找函数:
trailhead = 0
def find_trailheads(
topo_map: dict[tuple[int, int], int | None],
) -> tuple[tuple[int, int], ...]:
return tuple(key for key, value in topo_map.items() if value == trailhead)
基于维基百科对深度优先搜索的定义:
深度优先搜索(DFS)是一种用于遍历或搜索树或图数据结构的算法。它从根节点开始,沿着每个分支尽可能远地探索,并在回溯之前遍历完所有分支。
深度优先搜索动画示例(图片来自维基百科)
我们使用DFS算法实现爬升函数,寻找所有路径:
def climb(
topo_map: dict[tuple[int, int], int | None], trailheads: tuple[tuple[int, int], ...]
) -> dict[
tuple[tuple[int, int], tuple[int, int]], tuple[tuple[tuple[int, int], ...], ...]
]:
candidates: list[tuple[tuple[int, int], ...]] = [(head,) for head in trailheads]
result = {}
while candidates:
current = candidates.pop()
while True:
if topo_map[current[-1]] == trail_max:
result[(current[0], current[-1])] = result.get(
(current[0], current[-1]), ()
) + (current,)
break
elif steps := next_step(topo_map, *current[-1]):
incoming, *rest = steps
candidates.extend([current + (step,) for step in rest])
current = current + (incoming,)
else:
break
return result
else
子句中的 break
用于处理路径走到死胡同的情况,避免无限循环。
爬升函数返回一个字典,键为(起点,终点)对,值为所有到达该终点的路径。
第一部分:计算可到达的独特峰值数量,即字典的键值对数量:
def part1(input: str) -> int:
topo_map = parse(input)
return len(climb(topo_map, find_trailheads(topo_map)))
第二部分:计算所有路径的总数,即所有路径数量的总和:
def part2(input: str) -> int:
topo_map = parse(input)
return sum(
len(routes) for routes in climb(topo_map, find_trailheads(topo_map)).values()
)
总结:本文详细介绍了使用深度优先搜索算法解决第十天难题的完整过程,并对代码进行了优化和解释。 通过对算法和代码的深入分析,展现了高效解决多路径搜索问题的思路。 最后,个人求职经历的分享也为文章增添了一丝人文色彩。
以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
458 收藏
-
167 收藏
-
374 收藏
-
338 收藏
-
492 收藏
-
483 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习