AtCoder Beginner Contest 007 C – 幅優先探索 をPython3で解く

Share

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

出典:
AtCoder Beginner Contest 007 C – 幅優先探索

昔はこれがdiff1000だったのか……という問題。なんと問題文にほとんど解き方が書いてあり、牧歌的な時代だったのを感じさせる。

# AtCoder Beginner Contest 007 C - 幅優先探索
# https://atcoder.jp/contests/abc007/tasks/abc007_3
# tag: BFS 基礎問題 高橋君

# 普通に幅優先探索すればいい。
from collections import deque
def main():
    R, C = map(int, input().split())
    sy, sx = map(int, input().split())
    gy, gx = map(int, input().split())

    # 0-indexed にする
    sy -= 1
    sx -= 1
    gy -= 1
    gx -= 1

    field = [[c for c in input()] for _ in range(R)]

    # 距離を保存する。 -1 なら未訪問。
    dist = [[-1] * C for _ in range(R)]

    # 動き方をあらかじめ持っておくと楽。
    moves = ((1, 0), (-1, 0), (0, -1), (0, 1))

    queue = deque([(sx, sy)])
    dist[sy][sx] = 0

    while queue:
        x_now, y_now = queue.popleft()
        for dx, dy in moves:
            x_nxt, y_nxt = x_now + dx, y_now + dy

            # 範囲チェック
            if not (0 <= x_nxt < C and 0 <= y_nxt < R):
                continue

            # 訪問済みかどうかと、壁チェック
            if dist[y_nxt][x_nxt] != -1 or field[y_nxt][x_nxt] == '#':
                continue

            dist[y_nxt][x_nxt] = dist[y_now][x_now] + 1
            queue.append((x_nxt, y_nxt))
    
    print(dist[gy][gx])

main()
Share

コメントを残す

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