Advent of Code 2025 挑战全手写代码 Day 9 - 电影院

🎄 Advent of Code 2025 挑战全手写代码 Day 9 - 电影院


大家好,我又回来了~ 今日(day 9)题目 Movie Theater 难度困难(四星 ⭐⭐⭐⭐),核心考察:枚举平面几何扫描线与奇偶判定

advent-of-code-2025-day-9

📖 题目速览

  • 题目地址: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

✨ 复盘与优化思考

  • 边界处理是难点:顶点接触与整段贴边界应视为合法,真正的“穿越型交叉”才是非法,扫描线区间能自然表达“整段覆盖”。
  • 若需要进一步提速,可:
    • 预索引唯一 y/x 的边列表,避免全表扫描。
    • 坐标压缩 + 前缀奇偶计数,常数更小。

Happy Coding! 电影院关灯,几何开演!📐🎬 即使暂时卡壳也不要气馁,只做完 Part 1 也有一颗星 ⭐
day-9-ranking

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值