[アルゴリズム]迷宮探索2178py - BFS

8808 ワード

https://www.acmicpc.net/problem/2178
from collections import deque

n, m = map(int, input().split())
data = []

dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]

for i in range(n):
    data.append(list(map(int, input())))

visited = [[0] * (m + 1) for i in range(n + 1)]

queue = deque([[0,0]])
visited[0][0] = 1
while queue:
    a,b= queue.popleft()
    if (a+1)==n and (b+1)==m:
        print(visited[a][b])
        break
    for i in range(4):
        if n>a + dy[i]>=0 and m>b + dx[i]>=0:
            if data[a + dy[i]][b + dx[i]] == 1 and visited[a + dy[i]][b + dx[i]] == 0:
                queue.append([a + dy[i], b + dx[i]])
                visited[a + dy[i]][b + dx[i]] = visited[a][b]+1

  • ラビリンス座標を与えることでBFSをナビゲート
    1 (0,0) 0 1 1 1 1
    1 (0,1) 0 1 0 1 0
    1 (0,2) 0 1 0 1 1
    1 (0,3) 1 1 0 1 1

  • 東西南北をさぐる

  • 最小距離を求める
    1の格子が全部見つかりましたが、一番小さい格子の数はどうやって探しますか?
    visited[a + dy[i]][b + dx[i]] = visited[a][b]+1
    アクセス処理は、前の値に1を加算して表される.
    同じ幅にナビゲートした値は同じアクセス値を持つため、結果値は最小です.