🎅

Advent of Code 2024 Day 16: Reindeer Maze

に公開

このページは

2024 年の Advent of Code の Day16 の記事です。

https://adventofcode.com/2024/day/16

Day15 の内容はこちら。

https://zenn.dev/yasuharu519/articles/930eef6cd3d253

Day 16: Reindeer Maze

さて今回はトナカイオリンピックの時間です! トナカイたちが一番少ないポイントで迷路を抜けるという競技を行っているようです。

#######
#....E#
#.#.#.#
#.#.#.#
#S....#
#######

のような迷路のマップが与えられます。 S がスタート地点、E がゴール地点です。トナカイは最初東を向いており、 # で表される壁へは移動できません。向いている方向に 1 マス進むと 1 ポイント増えます。時計回りもしくは反時計回りに 90 度回転することもできますが、その場合は 1000 ポイント増えることになります。

Part1

Part1 では、スタート地点からゴール地点まで到達する場合の最小ポイントについて求める問題です。ダイクストラ法A* などの最短路探索アルゴリズムを使うことで解くことが出来そうです。

今回は現在向いている向きも考慮する必要があるため、途中の最短スコアを保存する際には向いている方向の情報も併せて保存しておくことにしましょう。

https://github.com/yasuharu519/advent-of-code-2024/blob/main/python/day16/part1.py#L9

のように、位置と共に向いている 4 方向も含めてスコアを保存するようにしました。

https://github.com/yasuharu519/advent-of-code-2024/blob/main/python/day16/part1.py#L22-L43

簡単にダイクストラで解く場合は、Python の場合は heapq を使って最小ヒープを作成してチェックして行くのが良いでしょう。

Part2

Part2 では、最短スコアを出す経路であるマスに椅子を置くことができ、いくつ椅子を置くことができるかを求める問題です。つまり、最短パスに含まれるマスがいくつあるかを求める問題です。

今回は最短路を求めるだけではなく、最短路となるすべての経路を求める必要があります。さてどうしましょうか。

Part 1 では、以下のようにゴール地点に到達した時点で結果を出力して終了していました。

https://github.com/yasuharu519/advent-of-code-2024/blob/main/python/day16/part1.py#L24-L33

Part2 では、最短路と同じポイントになる経路をすべて記録し、最短路に含まれるマスをすべて数え上げれば良さそうです。

https://github.com/yasuharu519/advent-of-code-2024/blob/main/python/day16/part2.py#L55-L62

Day 17 に続きます。

https://zenn.dev/yasuharu519/articles/6bc95f52efc503

Discussion