🎄 Advent of Code 2025 挑战全手写代码 Day 9 - 电影院
大家好,我又回来了~ 今日(day 9)题目 Movie Theater 难度困难(四星 ⭐⭐⭐⭐),核心考察:枚举、平面几何、扫描线与奇偶判定。

📖 题目速览
- 题目地址:https://adventofcode.com/2025/day/9
- 背景故事:沿着滑杆来到北极基地电影院,地面是大网格;部分瓷砖为红色。
- Part 1:从给定的红色点集合中任选两点作为矩形对角,最大化离散面积。
- Part 2:红点按顺序用水平/竖直的绿线相连形成闭环,环内也为绿。矩形仍需以两个红点为对角,但矩形覆盖的所有瓷砖必须都是红或绿。
🧠 解题思路(Python 🐍)
- Part 1(暴力枚举):
- 两两枚举红点对,离散面积计算为
(abs(dx)+1) * (abs(dy)+1)。
- 两两枚举红点对,离散面积计算为
今日挑战全手写失败!Part 2 还是 AI 太好用了!(手动狗头)
- Part 2(几何判定 + 扫描线区间覆盖):
- 如实说明:本题 Part 2 的核心几何判定由 AI 大模型辅助共同设计与实现,具体算法在代码中落地为“点在环内判定 + 四边整段覆盖校验”。
- 构造正交闭环:将输入点按顺序相连(首尾相接),分离成水平边与竖直边。
- 点在环内判定(奇偶规则):对矩形中心点做右射线,与竖直边交数奇偶判定;在边上也视为内。
- 扫描线区间覆盖:
- 为每个
y构造“内部允许”的x区间并并入同高水平边段(x_intervals(y)),用于校验矩形的上/下边是否完全落在红绿允许区域内。 - 为每个
x构造“内部允许”的y区间并并入同列竖直边段(y_intervals(x)),用于校验矩形的左/右边是否完全落在红绿允许区域内。
- 为每个
- 综合判定:
- 只有当中心在环内,且四条边均被对应扫描线区间“整段覆盖”,才计算离散面积并更新最大值。
🧩 关键代码片段
# Part 1:两两枚举红点对并计算离散面积
area = (abs(self.points[idx][0] - self.points[jdx][0]) + 1) \
* (abs(self.points[idx][1] - self.points[jdx][1]) + 1)
# Part 2:点在环内(在边上视为内)与扫描线区间覆盖(节选)
# inside:右射线奇偶
def inside(x: float, y: float) -> bool:
if on_edge(x, y):
return True
cnt = 0
for xv, ya, yb in vertical_edges:
if xv <= x:
continue
if ya <= y < yb:
cnt += 1
return (cnt & 1) == 1
# x_intervals(y):构造 y 行允许的 x 区间并合并
# y_intervals(x):构造 x 列允许的 y 区间并合并
⏱️ 复杂度分析
- Part 1:
O(n^2),常数低,可直接暴力;n为红点数。 - Part 2:候选矩形
O(n^2);每个候选做一次“中心点在内”与“四边区间覆盖”判定,最朴素为O(n)级扫描,总体近似O(n^3)。通过缓存与区间合并,平均开销明显降低,效果可接受。
📊 运行与结果
- 当前实现输出(以我的数据为例):
- Part 1:
4759930955 - Part 2:
1525241870
- Part 1:
✨ 复盘与优化思考
- 边界处理是难点:顶点接触与整段贴边界应视为合法,真正的“穿越型交叉”才是非法,扫描线区间能自然表达“整段覆盖”。
- 若需要进一步提速,可:
- 预索引唯一
y/x的边列表,避免全表扫描。 - 坐标压缩 + 前缀奇偶计数,常数更小。
- 预索引唯一
Happy Coding! 电影院关灯,几何开演!📐🎬 即使暂时卡壳也不要气馁,只做完 Part 1 也有一颗星 ⭐

798

被折叠的 条评论
为什么被折叠?



