【AtCoder】第三回 アルゴリズム実技検定 G - グリッド金移動 【python】
アルゴリズム実技検定 公式テキスト (エントリー~中級編)の6.3.1幅優先探索で
AtCoder Beginner Contest 007 C - 幅優先探索
の類題として挙げられている問題を解いてみました。
第三回 アルゴリズム実技検定 G - グリッド金移動
submission
障害物の範囲の外側を通るケースがあることに気づかず誤答してしまいました。
from collections import deque #座標を0以上に調整する #障害物のマスの制約から1マス広げる offset = 201 N, X, Y = map(int, input().split()) X += offset Y += offset sx, sy = 0 + offset, 0 + offset dist = [] #考えられるマスの範囲は0~402のためすべてのマスの個数は403 all_grid = offset * 2 + 1 #距離の初期値を-1 for i in range(all_grid): dist.append([-1] * all_grid) #障害物のあるマスは距離を-10とする for i in range(N): ox, oy = map(int, input().split()) dist[ox + offset][oy + offset] = -10 dist[sx][sy] = 0 Q = deque() Q.append([sx, sy]) while len(Q) > 0: x, y = Q.popleft() for x2, y2 in [[x + 1, y + 1], [x, y + 1], [x - 1, y + 1], [x + 1, y], [x - 1, y], [x, y - 1]]: if not (0 <= x2 <= 402 and 0 <= y2 <= 402): continue if dist[x2][y2] == -10: continue if dist[x2][y2] == -1: dist[x2][y2] = dist[x][y] + 1 Q.append([x2, y2]) print(dist[X][Y])
こちらのユーザ解説より、正確な範囲を考える必要はなく[-250,250]くらいで良いとのことで、勉強になりました。