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