深度優先搜尋(一)

2021-10-01 08:14:17 字數 2407 閱讀 1787

深度優先搜尋(dfs)是一種基本的圖演算法,主要針對圖和樹,英文縮寫:dfs。

【走迷宮】

深度優先搜尋的重要例子——走迷宮。

用迷宮代替圖,通道代替邊,路口代替定點,那麼我們就可以將迷宮看成是乙個圖。

要探索迷宮中的所有通道,我需要這樣做:(和dfs思想是一樣的)

圖例:

【題目】

迷宮由n行m列的單元格組成,每個單元格要麼是空地,要麼是障礙物,需要找到一條從起點通往終點的最短路徑。

注意:障礙物不能走,不能走到迷宮外面。

起點障礙

障礙障礙

終點障礙

起點為(1,1),只能往下走或往右走,我們乙個乙個進行嘗試。

先往右走,直到走不通的時候再往回回退,然後再去嘗試另外乙個方向。

起點(1,1)一步之內可以到達的點為(1,2)和(2,1),先往右走,到達(1,2)。

到達(1,2)後來判斷又能到達哪些點?只有(2,2),然後繼續往下走,直到無路可走或到達終點為止。

下圖是一種可行的搜尋路徑:1

2障礙3

4 5

障礙 6

障礙 終點8

7 障礙

【dfs】

dfs函式的功能是解決當前應該怎麼辦。

因此,這裡的dfs()需要維護3個引數,當前點的x座標,y座標,已經走過的步數step。如下

def dfs(x,y,step):

檢查是否已經到達終點,只需要判斷當前座標和終點座標是否相等就可以了,如果相等則表明已經到達終點的位置。

def dfs(x,y,step):

如果沒有到達終點,則找出下一步可以走的地方。但是有四個方向可以走,我先定義乙個方向陣列

next_step = [[0,1],  #向右走

[1,0], #向下走

[0,-1], #向左走

[-1,0] #向上走

]

通過這個方向陣列,使用迴圈就可以得到下一步的座標。

for i in range(len(next_step)):

next_x = start_x + next_step[i][0]

next_y = start_y + next_step[i][1]

接下來,要對下乙個點進行判斷,包括是否越界,是否為障礙物,是否這個點已經在路徑中(使用book[next_x][next_y]來記錄當前點是否已經在路徑中)

如果這個點符合所有的要求,就對這個點進行下一步,dfs(next_x,next_y,step+1).

def dfs(start_x,start_y,end_x,end_y,migong_array,step):

''':param start_x: 起始橫座標

:param start_y: 起始縱座標

:param end_x: 終點橫座標

:param end_y: 終點縱座標

:param migong_array: 迷宮的陣列

:return:

'''next_step = [[0,1], #向右走

[1,0], #向下走

[0,-1], #向左走

[-1,0] #向上走

]if (start_x == end_x and start_y == end_y):

global min

if(step < min):

min = step

return

for i in range(len(next_step)):

next_x = start_x + next_step[i][0]

next_y = start_y + next_step[i][1]

# 判斷是否越界

if(next_x < 0 or next_y < 0 or next_x > len(migong_array) or next_y > len(migong_array[0])):

continue

# 判斷是否為障礙物和已經在路中

if(a[next_x][next_y] == 0 and book[next_x][next_y] == 0):

book[next_x][next_y] = 1 #標記這個點已經被走過

dfs(next_x,next_y,end_x,end_y,migong_array,step+1)#嘗試下乙個點

book[next_x][next_y] = 0#嘗試結束,取消這個點的標記

return

深度優先搜尋(一)

輸入n個數字,輸出這n個陣列的全排列。分析 首先需要乙個資料結構來確定還有哪些資料沒有被排序,因此有了bool陣列is in,然後有乙個陣列用來裝已經被排列的陣列,因此有了陣列bucket。結束條件是當選了n個數字以後,也就是沒有數字可以放入bucket的時候,結束深度優先搜尋。選擇列表就是剩餘未排...

訓練一 深度優先搜尋

例1.poj 1979 red and black 題意 由 為起點,周圍最多有 跟它相連通,不能越過 本身也算乙個 輸入輸出 sample input 6 9.11 9 11 6 7 7.0 0sample output 4559613 include using namespace std ch...

廣度優先搜尋 深度優先搜尋

前言 這幾天複習圖論演算法,覺得bfs和dfs挺重要的,而且應用比較多,故記錄一下。廣度優先搜尋 有乙個有向圖如圖a 圖a廣度優先搜尋的策略是 從起始點開始遍歷其鄰接的節點,由此向外不斷擴散。1.假設我們以頂點0為原點進行搜尋,首先確定鄰接0的頂點集合s0 2.然後確定頂點1的集合s1 頂點2沒有鄰...