[問題解決]Back-2178ラビリンスナビゲーション(dfs&bfs)
14881 ワード
提问链接
問題の説明
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])
Reference
この問題について([問題解決]Back-2178ラビリンスナビゲーション(dfs&bfs)), 我々は、より多くの情報をここで見つけました https://velog.io/@redcarrot01/ProblemSolving-백준-2178-미로탐색dfsbfsテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol