DFS與BFS——理解簡單搜尋(中文虛擬碼+例題) | IT人
文章推薦指數: 80 %
深度優先搜尋演算法(Depth First Search):一種用於遍歷或搜尋樹或圖的演算 ... 每個節點被訪問後被踹出,為了程式碼的簡潔易懂,使用了c++的stl。
Togglenavigation
IT人
IT人
DFS與BFS——理解簡單搜尋(中文虛擬碼+例題)
Simon5ei發表於
2020-07-27
新的方法和概念,常常比解決問題本身更重要。
————華羅庚
引子
深度優先搜尋(DeepFirstSearch)廣度優先搜尋(BreathFirstSearch)當菜鳥們(比如我)初步接觸演算法的時候,會接觸這兩種簡單的盲目搜尋演算法,相較與其他眾多的演算法,這兩種演算法相對較好理解,運用範圍也很廣,在眾多的學科競賽裡都可以見到它們的影子,話不多說,我們開始。
深度優先搜尋(DeepFirstSearch)
深度優先搜尋演算法(DepthFirstSearch):一種用於遍歷或搜尋樹或圖的演算法。
沿著樹的深度遍歷圖的節點,儘可能深的搜尋圖的分支。
當節點v的所在邊都己被探尋過或者在搜尋時結點不滿足條件,搜尋將回溯到發現節點v的那條邊的起始節點。
整個程式反覆進行直到所有節點都被訪問為止。
屬於盲目搜尋,最糟糕的情況演算法時間複雜度為O(!n)。
做一個形象的比喻,dfs好比走迷宮,得一直走到頭,看看路的盡頭是不是出口,如果是,就直接走出去,如果不是,那就返回上一個“標記點”尋找不一樣的可行方法。
dfs的實現關鍵在於回溯,這個可以用兩種方法實現(遞迴、堆疊),以下給出虛擬碼
遞迴實現:
遞迴實現是dfs最廣泛的使用方法。
voiddfs(intx,inty)
{
if(達到出口||無法繼續)
{
相應操作;
return;
}
if(對應x方向的下一步可以繼續)
{
新增標記;//給該位置記上標記,如果後續遞迴呼叫碰到了這個點,則該方向不能繼續下一步
dfs(x+1,y);//呼叫遞迴
取消標記;//上一步對應的遞迴操作全部結束,則要取消標記對後續操作的影響
}
elseif(對應y方向的下一步可以繼續){
新增標記;
dfs(x,y+1);
取消標記;
}
}
棧實現:
棧實現的基本思路是將一個節點所有未被訪問的“鄰居”(即“一層鄰居節點”)壓入棧中“待用”,然後圍繞頂部節點進行判定,每個節點被訪問後被踹出,為了程式碼的簡潔易懂,使用了c++的stl。
voiddfs_stack(intstart,intn){
stack
同時當Extense處在某個格點時,他只能移動到東南西北(或者說上下左右)四個方向之一的相鄰格點上,Extense想要從點A走到點B,問在不走出迷宮的情況下能不能辦到。
如果起點或者終點有一個不能通行(為#),則看成無法辦到。
Input
第1行是測試資料的組數k,後面跟著k組輸入。
每組測試資料的第1行是一個正整數n(1<=n<=100),表示迷宮的規模是n*n的。
接下來是一個n*n的矩陣,矩陣中的元素為.或者#。
再接下來一行是4個整數ha,la,hb,lb,描述A處在第ha行,第la列,B處在第hb行,第lb列。
注意到ha,la,hb,lb全部是從0開始計數的。
Output
k行,每行輸出對應一個輸入。
能辦到則輸出“YES”,否則輸出“NO”。
SampleInput
2
3
.##
..#
#..
0022
5
.....
###.#
..#..
###..
...#.
0040
SampleOutput
YES
NO
AC程式碼
#include
延伸文章資訊
- 1圖的走訪— BFS, DFS(1). 之前有提到要怎麼建立一個圖 - Medium
以下的程式碼,使用的是C++。 主要在走訪有兩種方法:DFS(深度優先搜尋), BFS(廣度優先搜尋). 想必如果是一開始看到 ...
- 2[演算法] 深度優先搜尋(Depth-first Search) - iT 邦幫忙
30天學演算法和資料結構系列第18 篇 ... 表示目前是否有使用此數字total = 0 #代表可行解總共有幾種def dfs(step, total, a, ... +i))==1: pri...
- 3C++中的遞迴深度優先搜尋(DFS)演算法 - 程式人生
【C++】C++中的遞迴深度優先搜尋(DFS)演算法. 2020-12-21 C++. 我已經將 Graph 類中的圖實現為具有所有訪問和修改它所需功能的鄰接矩陣,這是我在DFS演算法中所需的 ...
- 4Depth-First Search and Breadth-First Search | 閱讀的城市貓
C語言系列: Depth-First Search and Breadth-First Search ... 找List中最後一個link void DFS(int);//以Recursive來...
- 5【DFS】深度優先搜尋遞迴方式講解- IT閱讀 - ITREAD01.COM ...
Depth First Search英文的縮寫,翻譯過來就是“深度優先搜尋”。 從名字上我們可以大概的看出,DFS主要是一種搜尋演算法,按照深度優先的方式. 深度優先搜尋 ...