廣度優先演算法,又稱寬度優先搜尋或橫向優先搜尋。簡稱為bfs。
本質:圖的遍歷(或搜尋)。
定義:從圖中某個頂點出發,訪問所有頂點,且每個頂點僅訪問一次。(包括連通圖和非連通圖)
適用:
1、訪問頂點vi ;
2、訪問vi 的所有未被訪問的鄰接點w1 ,w2 , …wk ;
3、依次從這些鄰接點(在步驟②中訪問的頂點)出發,訪問它們的所有未被訪問的鄰接點; 依此類推,直到圖中所有訪問過的頂點的鄰接點都被訪問;
重要:有乙個值來標誌某一節點是否被訪問過。
網易地牢逃脫
給定乙個 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'x' 表示不可通行的障礙,
牛牛從 (x0 , y0 ) 位置出發,遍歷這個地牢,和一般的遊戲所不同的是,他每一步只能按照一些指定的步長遍歷地牢,
要求每一步都不可以超過地牢的邊界,也不能到達障礙上。地牢的出口可能在任意某個可以通行的位置上。
牛牛想知道最壞情況下,他需要多少步才可以離開這個地牢。
輸入描述:
每個輸入包含 1 個測試用例。每個測試用例的第一行包含兩個整數 n 和 m(1 <= n, m <= 50),表示地牢的長和寬。
接下來的 n 行,每行 m 個字元,描述地牢,地牢將至少包含兩個 '.'。
接下來的一行,包含兩個整數 x0, y0,表示牛牛的出發位置
(0 <= x0 < n, 0 <= y0 < m,左上角的座標為 (0, 0),出發位置一定是 '.')。
之後的一行包含乙個整數 k(0 < k <= 50)表示牛牛合法的步長數,
接下來的 k 行,每行兩個整數 dx, dy 表示每次可選擇移動的行和列步長(-50 <= dx, dy <= 50)
輸出描述:
輸出一行乙個數字表示最壞情況下需要多少次移動可以離開地牢,如果永遠無法離開,輸出 -1。
以下測試用例中,牛牛可以上下左右移動,在所有可通行的位置.上,地牢出口如果被設定在右下角,
牛牛想離開需要移動的次數最多,為3次。
輸入例子1:
3 3...
......
0 14
1 00 1
-1 0
0 -1
輸出例子1:
3
問題分解:
出口在任意某個通行位置上,最壞情況下,多少步離開地牢。
最壞情況,剛開始理解為了,最多要多少步。其實非也,當出口不確定時,最壞情況是指,出口離起點最遠,需要遍歷所有點。
而是否最遠,起點到出口的最短路徑衡量。
遍歷所有點+最短路徑=廣度優先演算法
結構分析:
需要進行座標運算,封裝point類可以簡化**
廣度優先一般用佇列實現。當起點入隊之後,需要以佇列是否為空為條件迴圈,while結構。
儲存結構:
地牢描述,是乙個n*m的二維陣列,儲存該點可通行'.'或障礙物'x'
是否經過該點,用列表儲存遍歷過的下標。
路徑,也就是走了幾步,需要乙個和地牢描述結構相同的二維陣列儲存。起始值均為1。當滿足乙個點為下乙個點的可通行節點時,對應值增加1。
**展示:
import queue
class point(object):
def __init__(self,x,y):
self.x=x
self.y=y
@property
def isok(self):
if 0<=self.x
return true
else:
return false
def go(self,d):
return point(self.x+d[0],self.y+d[1])
if __name__=='__main__':
n,m=[int(x) for x in input().split()]
a= #二維陣列描述地牢
use_point=0
for i in range(n):
use_point+=a[i].count('.')
x0,y0=[int(x) for x in input().split()]
k=int(input())
kli= #儲存步長
for i in range(k):
dx,dy=(int(x) for x in input().split())
print(n,m)
print(a)
print(x0,y0)
print(k)
print(kli)
tt_li=
start=point(x0,y0)
q=queue.queue()
q.put(start)
eli=[[0 for j in range(m)]for i in range(n)]
while not q.empty():
temp=q.get()
for i in kli:
next_point=temp.go(i)
ttemp=(next_point.x,next_point.y)
if next_point.isok and (ttemp not in tt_li):
q.put(next_point)
eli[next_point.x][next_point.y]=eli[temp.x][temp.y]+1
if len(tt_li)==use_point:
temppp=
for x in eli:
print(max(temppp))
else:
print(-1)
地牢逃脫 BFS
題意 給定乙個 n 行 m 列的地牢,其中 表示可以通行的位置,x 表示不可通行的障礙,牛牛從 x0 y0 位置出發,遍歷這個地牢,和一般的遊戲所不同的是,他每一步只能按照一些指定的步長遍歷地牢,要求每一步都不可以超過地牢的邊界,也不能到達障礙上。地牢的出口可能在任意某個可以通行的位置上。牛牛想知道...
演算法 廣度優先搜尋 BFS
廣度優先搜尋主要解決兩類問題 1 從a節點出發,有到b節點的路徑麼?2 從a節點出發,到b節點的最短路徑是什麼?演算法複雜度為o v e 其中v為頂點,e為邊數。例 假設你要在朋友中找乙個芒果銷售商,如果朋友中沒有,則找朋友的朋友,即人際關係網。實現的是第一類問題,在你的人際關係王忠,能找到芒果銷售...
BFS廣度優先搜尋演算法
廣度優先搜尋 bfs 包含一下幾個關鍵點 1.狀態 2.狀態轉移方式 3.有效狀態 4.佇列 5.標記 void bfs 起始點 隊列為空,廣搜結束 看乙個例子 說有一天公主被大魔王抓了,關進了乙個迷宮裡,需要你這位勇士去營救 當然成功了就自然是公升職加薪贏取白富美啦 這個迷宮以二維陣列的形式給出 ...