AtCoder Beginner Contest 151 D – Maze Master をPython3で解く

Share

AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。

出典:
AtCoder Beginner Contest 151 D – Maze Master

制約が小さいので、\(O(N^4)\)で全探索を頑張る。

# AtCoder Beginner Contest 151 D - Maze Master
# https://atcoder.jp/contests/abc151/tasks/abc151_d
# tag: グリッド 再長距離 BFS 高橋君 青木君

# どこからスタートするのかについて、全探索する。
# 一回一回の各最長距離については、BFS で取得すればいい。

from collections import deque
def main():
H, W = map(int, input().split())
field = [input() for _ in range(H)]

# BFS で距離を算出し、最大のものを返す関数を作っておく
def get_longest(sx, sy):
moves = ((-1, 0), (1, 0), (0, -1), (0, 1))
dist = [[-1] * W for _ in range(H)]
dist[sy][sx] = 0
queue = deque([(sx, sy)])
while queue:
now_x, now_y = queue.popleft()
for dx, dy in moves:
nxt_x, nxt_y = now_x + dx, now_y + dy
if not(0 <= nxt_x < W and 0 <= nxt_y < H):
continue
if dist[nxt_y][nxt_x] == -1 and field[nxt_y][nxt_x] == '.':
dist[nxt_y][nxt_x] = dist[now_y][now_x] + 1
queue.append((nxt_x, nxt_y))
return max(v for row in dist for v in row)

result = 0
# スタート地点を全て試す
for x in range(W):
for y in range(H):
if field[y][x] == '#':
continue
tmp_r = get_longest(x, y)
if tmp_r > result:
result = tmp_r

print(result)

main()
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です