この記事で使うアルゴリズム
深さ優先探索
はじめに
カテゴリー競プロ初中級者100問では、Qiita
にて@e869120
さんがレッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編:目指せ水色コーダー!】としてまとめられている100問をPython
で解いています。
全問題の一覧はこちらです
問題
https://atcoder.jp/contests/abc088/tasks/abc088_d
この問題は幅優先探索を用いて解くことができます。
幅優先探索はキューによって実装できます。
Pythonの場合、キューはqueue.Queue
やcollections.deque
を利用すると良いでしょう。いずれも標準ライブラリです。
この記事ではqueue.Queue
を用います。
この問題を解くまえに
この問題は幅優先探索の応用です。まずは、ABC007C 幅優先探索を先に解いても良いでしょう。
方針
- ゴールにたどり着くまでに通ったマス以外の白マスは黒く塗りつぶすことができる。
- つまり出来るだけ少ないマスを通ってゴールにたどり着けば良いので、最短経路問題に帰着される。
- ここでは幅優先探索を用いて最短経路問題を解く
- つまり出来るだけ少ないマスを通ってゴールにたどり着けば良いので、最短経路問題に帰着される。
幅優先探索の実装
- キューを作成する。キューの各要素は(y座標、z座標、スタート地点からの距離)として利用していく。
- キューにスタート地点を
enqueue
する。 - 幅優先探索を行う。具体的には、以下の処理をキューが空になるまで繰り返す。
dequeue
する- 訪問済みの場合は無視する
- 未訪問の場合
- 訪問フラグを立てる
- 移動可能かを確認し、
enqueue
する
ポイント
訪問済みかどうかの確認はenqueue
する前には必須である。
この問題の場合、dequeue
した後には必須ではないが確認するべきだと思われる。
(スタート地点からの距離が等しいマスが、同じマスを複数回enqueue
する可能性があり、queueのサイズが肥大化するためTLEやMLEのリスクが増える)
コード
1 | import sys |
記事情報
- 投稿日:2020年4月17日
- 最終更新日:2020年5月8日