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

コメントを残す

メールアドレスが公開されることはありません。