1001アルゴリズム
11759 ワード
DFSとよく出てくるのがBFSです.BFはBreath First Search,幅優先探索である.最近のノードから探索を開始する.DFSは深さであるため,可能な限り開いたノードを最初にブラウズし,BFSは逆である.BFSは、通常、キューデータ構造を使用する.アルゴリズムを記述して隣接ノードをキューに繰り返し入れると、最初に入ったノードは終了し、近いノードからナビゲートします.
1)ナビゲーション開始ノードをキューに挿入してアクセス処理を行う.
2)ノードをキューから取り出し,そのノードの隣接ノードの主がアクセスしていないノードをすべてキューに挿入し,アクセス処理を行う.
3)これ以上できなくなるまで.
3 3
110
010
011 -> 5
最初の点が(1,1)の場合
(1,1),(1,2),(1,3)
(2,1),(2,2),(2,3)
(3,1),(3,2),(3,3)そうです.最短経路の場合はBFSで解決するのが望ましい.bfsは、始点に近いノードから順にグラフィック内のすべてのノードを参照するためである.
例を挙げると.
(1,1)アクセス処理を行い,(1,1)ポップアップし,周辺ノードにおいてアクセスされていない場所(1,2)をキューに入れてアクセス処理を行う.次に(2,2)をポップアップし、周囲のノードがアクセスしていない(3,2)に再び移動します.またそこで同じことをして、それから行きます(3,3).だから
1)ナビゲーション開始ノードをキューに挿入してアクセス処理を行う.
2)ノードをキューから取り出し,そのノードの隣接ノードの主がアクセスしていないノードをすべてキューに挿入し,アクセス処理を行う.
3)これ以上できなくなるまで.
from collections import deque
def bfs(graph, start, visited):
#graph는 인접 리스트로 표현한 것
#start는 시작점
#visited는 방문했는지 안했는지를 T/F로 표현
#큐 구현을 위해 deque 사용
queue = deque([start])
#지금 있는 곳의 노드는 방문처리
visited[start] = True
#queue가 빌떄까지 반복
while queue:
v = queue.popleft()
print(v, end = ' ')
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
graph = [ []. [2,3,8], [1,7], [1,4,3]........]
visited = [False] * 9
bfs(graph, 1, visited)
#脱出迷路:NxMサイズの矩形迷路と同じ.(1,1)から(N,M)まで一度に1マス移動できます.0,1ですが、1しか使えず、最も少ない格数を要求します.セルの計算には、開始セルと最後のセルが含まれます.3 3
110
010
011 -> 5
最初の点が(1,1)の場合
(1,1),(1,2),(1,3)
(2,1),(2,2),(2,3)
(3,1),(3,2),(3,3)そうです.最短経路の場合はBFSで解決するのが望ましい.bfsは、始点に近いノードから順にグラフィック内のすべてのノードを参照するためである.
例を挙げると.
(1,1)アクセス処理を行い,(1,1)ポップアップし,周辺ノードにおいてアクセスされていない場所(1,2)をキューに入れてアクセス処理を行う.次に(2,2)をポップアップし、周囲のノードがアクセスしていない(3,2)に再び移動します.またそこで同じことをして、それから行きます(3,3).だから
from collections import deque
n,m = map(int, input().split())
graph = []
for i in range(n):
graph.append(list(map(int,input())))
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 ny < 0 or nx >= n 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]
print(bfs(0,0))
Reference
この問題について(1001アルゴリズム), 我々は、より多くの情報をここで見つけました https://velog.io/@rodeve/1001-알고리즘テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol