Advent of Code 2025 完赛记录
2025-12-31 #python连续几年都参加了 AOC,但是没有一年能完赛,今年终于完成了比赛。今年的题目不会很难,而且题量缩减,再加上大模型也能给一点思路(其实用大模型写代码的话估计可以秒杀很多题目,但是我没有这么用),所以还是能做完的。这篇文章主要讲一下里面用到了一些算法的地方。
Day5 Part2
题目可以理解为找出给定的所有区间内的整数。而且也给了提示区间是有重复的,所以我们遍历所有区间,来不断的合并重复的区间,并删除原本的区间,直到没有线段可以合并,说明合并完成。假设两个区间分别 (start, end) 和 (a_start, a_end),判断在 x 轴上重合可以用 max(start, a_start) <= min(end, a_end) 这个公式来判断。
: =
= 0
break
=
=
, =
# 线段已经被删除了,无需判断
continue
, =
continue
# 线段重合
# 没有可以合并的线段,退出循环
break
# 计算合并后的线段
=
+= - + 1
Day8 Part2
Part1 题目为在连接 1000 条边之后,找出边的长度最大的 3 颗树。可以转换为使用并查集来推导出森林,然后再遍历森林找出最大的树。
Part2 题目为找出最小生成树。在 Part1 已经有并查集的情况下,使用克鲁斯卡尔算法计算,即可解决。
# https://zhuanlan.zhihu.com/p/666225895, 这个 Python 实现是错的...
# https://blog.csdn.net/WZHao000/article/details/142529658
: =
return
=
return
=
=
=
return
=
= 0
, = ,
continue
+= 1
break
Day9 Part2
这是两个多边形是否相交问题的简化版本,一个多边形和一个矩形是否相交。可以检查 4 个点是否在多边形内,再检查边是否在多边形内,即可解决。但是我偷懒了,使用了 "shapely" 库来解决。
TODO: 对比 shapely 的结果来写出手动检查的版本
, = ,
, = ,
=
return *
return 0
=
=
=
Day10 Part2
这个是通过 z3-solver 的 Optimize 来解决的,我特意看了一下 reddit 上的解答,发现大家都在用 SMT 来解决的,所以我就学习了一个老哥的做法。
其实有看到头铁的老哥,通过求算矩阵方程+暴力循环找最优解的
# https://github.com/nitekat1124/advent-of-code-2025/blob/main/solutions/day10.py
= 0
, * =
*, =
=
=
= # z3 魔法,小子
=
# 每个按钮点击次数 >= 0
# 遍历按钮看一下当前 jol 是否被按钮影响到
# 如果影响到就计数
=
=
+= # type: ignore
Day11 Part2
这个题目是找到图中几个点之间有多少条路线,通过 DFS + 缓存会在求解第一条路线的时候卡住,问了一下 Deepseek, 他给出了使用拓扑排序 + 动态规划可以很快的解决。有一种可能经过的路线为 "dac" => "fft",但是在我的数据中,这个路线没有联通的可能性,所以直接忽略了。
return 1
return
= 0
+=
=
return
# 初始化入度
=
+= 1
# 拓扑排序
=
=
=
-= 1
# DP计数
=
= 1
+= # 对于每一个节点,更新他的邻居
return
: =
, =
=
=
# dac_fft = dfs_cached("dac", "fft", graph, {})
=
=
=
Day12 Part1
题目是一个很复杂的问题,是不规则多边形填充到矩形问题,可以通过回溯法 + 剪枝来实现,但是题目作者特意优化数据,导致直接计算不规则多边形的面积是否大于矩形就可以解决了,让大家过了个好年(好圣诞节)。
总结
虽然题目难度不大,但是还是重新复习了不少东西。