很多人聽到這個「dfs」可能會頭暈眼花。這個演算法聽起來很難,其實並沒有大家想象中的一樣,它反而更容易理解一些。只要有乙個自定義函式的基礎,就一定能學會。深度優先搜尋,顧名思義,就是進行深度的搜尋。去尋找乙個終點。對於官方的解釋呢,是這樣的:
- dfs(depth-first-search)深度優先搜尋演算法,是搜尋演算法的一種。是一種在開發爬蟲早期使用較多的方法。它的目的是要達到被搜尋結構的葉結點。
剛看到這句話,會頭暈眼花,很多人不解,爬蟲是什麼,葉節點是什麼?
不過有些人會認為濕濕碎
那我們來一步一步的理解和**。
我們要完成以下任務:
我們假設乙個場景,你要從你家到學校,肯定會有許多條路。如果你又懶,又想知道哪條路徑最快或者一共有多少條路,你就乾脆別去了 ,你就可以使用dfs深度優先搜尋去完成。
這時候,我們就請乙個人,叫他代替我們去走完所有的路徑。不過這個人有點笨,就屬於那種不見棺材不掉淚,不見黃河心不死的人。他就要無路可走才退出去。我們來畫乙個圖
a
/ \
b c
// | |
d e f
這裡的a就代表著你家,f就是學校。
我們要讓那個笨得要死的人從a點出發,先看看a有沒有延伸的路徑(是否有路可走)如果有,就走,沒有,就返回上乙個點。當他每走一條路,
所以他的路徑是這樣的:
a—>b—>d—>b—>e—>b—>a—>c—>f—>c—>a
所以說做完深搜後會返回最初的乙個點,也可以說什麼都沒有發生過。
(理解後請在上面打鉤~)
深搜基本上有乙個固定的框架,方便我們去使用。
void
dfs(
int x,
int y,
int k)
//這裡要用空函式,x和y看時候用,k表示步數
}}
深搜之所以叫回溯演算法,是因為運用了遞迴演算法。我們在每走一步的時候,都要把上一步封上,也就是「=1;」或題目要求。
演算法總數就是我們以自身為0,0,可以走那幾個方向,我們要用座標形式來表示出來方向。
當我們沒有到達終點時,要繼續往前走,到達終點按照題目要求輸出或記錄。
描述
定義乙個二維陣列:
int maze[5][5] =
;它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。
輸入乙個5 × 5的二維陣列,表示乙個迷宮。資料保證有唯一解。
輸出左上角到右下角的最短路徑長度,格式如樣例所示。
樣例輸入
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
樣例輸出
8
演算法基礎 dfs
dfs 搜尋和遍歷演算法 訪問v 走了這一步後發生了什麼 對所有鄰接v的沒訪問過的u遞迴呼叫dfs u 圖的表示 鄰接矩陣o n2 簡單,鄰接表o n e 適合邊少的圖 城堡問題 用遍歷演算法染色。圖已經包含在城堡陣列中,不需要額外表示 踩方格 受步數n控制的dfs,因為是求所有路徑而不是簡單的遍歷...
基礎演算法 DFS
注 dfs演算法應用場景 1.遍歷樹 圖等資料結構。2.一些動態規劃問題,例如最優子串行問題。dfs演算法的運用 dfs演算法實現的方式有多種 棧 遞迴.用的最多的就是遞迴的方式。遞迴函式的一般組成 遞迴邊界和遞迴式,遇到邊界開始回溯。例子 揹包問題 給定 n 件物品 編號0 n 1 和乙個容量為 ...
DFS基礎入門
dfs思想 通過迭代遞迴進行搜尋 2.搜尋的結束條件 3.確定下層搜尋入口 4.重複判斷 5.分析題目,觀察路徑是否需要訪問多次,若是則需要回溯,反之,不用 include bits stdc h using namespace std int k,n int num 20 a 20 num用來儲存...