• Home
  • About
    • 康青旭 - Germán Caggianese photo

      康青旭 - Germán Caggianese

      Refactoring entropy in my Mind

    • Learn More
    • Email
    • Instagram
    • Github
    • Codeberg   Codeberg
  • All Posts
  • Projects
  • Areas
  • Resources

Advent of Code 2025 - 第 7 天:Zig

07 Jan 2026

Reading time ~2 minutes

「突然間,你發現自己在一個陌生的房間裡!這個房間沒有門。」

本文翻譯自英文原文。

Github: GCaggianese/AoC-2025/D7

  • Zig Programming language

題目 第 7 天:Laboratories

第一部分

由上往下處理。對每個格子 a_{i,j}:

  • . -> 不做事
  • S 或 | -> 查看 $a_{i+1,j}$(下方格子):
    • 如果是 . -> 改成 |
    • 如果是 ^ -> $a_{i+1,j-1}$ 與 $a_{i+1,j+1}$ 變成 |
      • 重要:將 ^ 標記為已使用

計算有多少個 ^ 分裂器被標記為已使用。

第二部分

當 ^ 分裂一次只朝一個方向前進時,計算所有可能的時間線。

對每個格子 a_{i,j}:

  • col >= cols -> 回傳 1(路徑完成)
  • row >= rows -> 回傳 1(到達底部)
  • $a_{r,col}$ 是 ^ -> 遞迴:
    • countPaths(r+1, col-1) + countPaths(r+1, col+1)
    • 若 col == 0 -> 左分支回傳 1(離開網格 = 完成)

範例

.S.        .S.   .S.
...   →    .|.   .|.
.^.        |^.   .^|
...        |..   ..|
..^        |.^   .|^

左路徑:1(到達底部) 右路徑:碰到 (4,2) 的 ^ -> 再次分裂 -> 2 總計:3 條時間線

最佳化

使用 HashMap(State, usize) 做 memoization,其中 State = {row, col}。 避免從同一位置重複計算路徑。

除非另有說明,否則本網站的內容均根據 知識共享姓名標示 4.0 國際 授權協議獲得許可。

© 2026 Germán Caggianese(康青旭)