「突然間,你發現自己在一個陌生的房間裡!這個房間沒有門。」
本文翻譯自英文原文。
Github: GCaggianese/AoC-2025/D7
題目 第 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}。 避免從同一位置重複計算路徑。