廣度優先搜尋BFS

2021-09-12 14:53:09 字數 1428 閱讀 2368

迷宮題:

給定乙個二維矩陣,1表示不能走,0表示能走。再給定乙個起點和終點,只可以上下左右,求出最短路徑。

廣度優先搜尋依次搜尋走1步、走2步、走3步能到的位置,走的路徑逐漸增大,到終點時立即返回,所以最終當函式返回時一定是最短路徑。

from collections import deque

dirs = [(-1,0),(1,0),(0,-1),(0,1)] #上下左右

arrows = ['^','v','<','>']

class node:

def __init__(self, x, y, deep, path):

self.x = x

self.y = y

self.deep = deep #儲存到達當前點走了多少步

self.path = path #表示到達當前點的路徑,即走法

def bfs(mat,start,end):

m = len(mat)

n = len(mat[0])

visited = [[false for j in range(n)] for i in range(m)] #表示每個點是否已經走過

visited[start.x][start.y] = true #將起點處置為走過

que = deque([start]) #用佇列儲存要處理的點

while(que):

now = que.popleft() #每次處理隊首

if now.x == end.x and now.y == end.y: #到達終點,迴圈結束

print(now.path)

return now.deep

for i,dir in enumerate(dirs): #嘗試往四個方向走

next = node(now.x+dir[0],now.y+dir[1],now.deep+1,now.path+[arrows[i]]) #選定乙個方向,算出該點,深度加一,路徑加一

if next.x < 0 or next.x >= m or next.y < 0 or next.y >= n or mat[next.x][next.y]==1: #出範圍或不能走時continue

continue

if not visited[next.x][next.y]: #該方向未訪問過

visited[next.x][next.y]=true #標記為訪問

return -1

mat = [[0,1,0,0,1],

[1,0,0,1,1],

[0,0,1,1,0],

[1,0,0,0,1]]

start = node(0,0,0,)

end = node(1,1,0,)

print(bfs(mat,start,end))

BFS廣度優先搜尋

廣度優先搜尋,利用佇列實現,結束標誌是隊列為空的時候 承接dfs的演算法實現的講例,對於迷宮問題我們也可以採取廣度優先搜尋實現 include iostream include cstdio include cstdlib using namespace std int map 55 55 int ...

bfs廣度優先搜尋

這一課我們來學習圖的另一種遍歷方法 廣度優先搜尋 breadth first search,簡稱 bfs 這是一種連通圖的常用遍歷策略,通常用於求起點到各點的最短路徑,以及求兩點之間的最優路徑等問題。首先我們先來看看廣度優先搜尋的具體方法吧 對於乙個連通圖,我們假設一開始所有頂點均未被訪問,廣度優先...

廣度優先搜尋bfs

bfs即廣度優先搜尋演算法,其是搜尋演算法中的一種。1.dfs常用於尋找是否存在解 其從a節點出發,選取乙個臨近點b,然後不斷深入,在搜尋完b的下屬節點 ehif 後,回到a再搜尋臨近a的c節點,以此類推。2.bfs則用於在最短的時間或最少的移動距離內找到解 其往往從a節點出發,搜尋周圍所有的圍繞節...