深度優先搜尋(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沒有鄰...