[問題解決]Back-2178ラビリンスナビゲーション(dfs&bfs)


提问链接


問題の説明


N×Mサイズの配列として表現された迷路があります.
101111101010101011111011
迷路では、1は移動可能なセル、0は移動不可能なセルを表します.これらの迷路が与えられた場合、(1,1)から(N,M)の位置に移動する際に通過しなければならない最小セル数を求めるプログラムを作成します.1つのセルから別のセルに移動する場合は、隣接するセルにのみ移動できます.
上記の例では、(N,M)の位置に移動するには15格子を通過しなければならない.数欄には、開始位置と到達位置も含まれます.

入力


第1行は2つの整数N,M(2≦N,M≦100)を与える.次のN行には迷路としてM個の整数がある.各数を入力として加算します.

しゅつりょく


出力は最初の行の最小セル数を通過する必要があります.常に到着位置まで移動できる場合のみ、入力として使用されます.

入力例1


4 6
101111
101010
101011
111011

サンプル出力1


15

入力例2


4 6
110110
110110
111111
111101

サンプル出力2


9

入力例3


2 25
1011101110111011101110111
1110111011101110111011101

サンプル出力3


38

せきぶん


bfsによる実装
コンセプトアレンジ部から見ると,迷宮脱出タイプはdfsで解決された.
この問題はその中から最短距離を見つける必要があります.
完全な検索を行い、最小値のdfsを探すと、時間の複雑さが増加します.
👉最短距離解問題はbfsで実現した.👈

コード1

from collections import deque
n, m = map(int, input().split())
graph = []       
graph = [list(map(int, input())) for _ in range(n)] # 문자열 입력받아서 리스트화, 이것을 n번 반복해서 인접행렬 변환


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

def bfs(x, y):
    
    queue = deque()
    queue.append((x, y))

    while queue:
        x, y = queue.popleft()
        
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

            if nx < 0 or nx >=n or ny<0 or ny>= m:
                continue

            if graph[nx][ny] ==0:
                continue
            
            if graph[nx][ny] == 1:   
                graph[nx][ny] = graph[x][y] + 1
                queue.append((nx, ny))
    return graph[n-1][m-1]
                                        
bfs(0,0)    

コード2

from collections import deque

n, m = map(int, input().split())
graph = []       
graph = [list(map(int, input())) for _ in range(n)]

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

visit = [[False]*m for _ in range(n)]

q= deque()
q.append((0, 0))
visit[0][0] = True

while q:
    x, y = q.popleft()
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        
        if nx>=0 and nx<n and ny>=0 and ny<m:
            if visit[nx][ny] == False and graph[nx][ny] == 1:
                graph[nx][ny] = graph[x][y] + 1
                q.append((nx, ny))
                visit[nx][ny] =True

print(graph[n-1][m-1])