深度優先搜尋(dfs)

2021-10-12 08:16:49 字數 2080 閱讀 7683

深度優先搜尋(depth-first-search)是搜尋演算法的一種。是沿著樹的深度遍歷樹的節點,盡可能深的搜尋樹的分支。當節點v的所有邊都己被探尋過,搜尋將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,則選擇其中乙個作為源節點並重複以上過程,整個程序反覆進行直到所有節點都被訪問為止。屬於盲目搜尋。

對於上述影象中的資料,我們可以對其進行dfs方式的全面搜尋,首先以a為頂點,從頂點開始,將乙個支路走完再走下一條路,搜尋過程為

a-b-e、a-b-f、a-b-c、a-d-g

即是一種不撞南牆不回頭的搜尋方式。

通過對深度優先搜尋的掌握,我們首先可以用其進行對n個數字進行全排列,比如輸出1-3的所有排列方式

設想我們有3個卡片分別為1.2.3,以及三個紙箱記為1.2.3。那麼所有的卡片放入紙箱的情況即為全排列

那麼我們先把1放入1號箱子,2放入2號箱子,3放入3號箱子。這是第一種情況

隨後我們可以把3從3號箱子取出,然後發現沒有新的情況,於是我們可以把2從2號箱子取出,這時就有了新的放法,我們把3放入二號箱子,把2放入三號箱子,新的放法出現。

這時我們需要再次取出卡片來找到新的放法,我們取出2.3號卡,依然不行,於是我們從1號箱子取出1號,放入2號,隨後二三號箱子放入1.3卡片,新的放法又出現了

以此類推,直到全排列

排列順序為

1-2-3

1-3-2

2-1-3

2-3-1

3-1-2

3-2-1

實現**如下:

#includeusing namespace std;

int n,step,a[1000],book[1000]; //a是排列的陣列,book是用來判斷第n個數字是否已經被使用

void dfs(int step) //深度優先搜尋函式,排列第step號箱子

for(int i=1;i<=n;i++) }

return;

}int main()

我們將程式執行,輸入3

發現規律和我們推導的一致

那現在我們可以嘗試看題

這有乙個迷宮,有0-8行和0-8列:

1,1,1,1,1,1,1,1,1

1,0,0,1,0,0,1,0,1

1,0,0,1,1,0,0,0,1

1,0,1,0,1,1,0,1,1

1,0,0,0,0,1,0,0,1

1,1,0,1,0,1,0,0,1

1,1,0,1,0,1,0,0,1

1,1,0,1,0,0,0,0,1

1,1,1,1,1,1,1,1,1

0表示道路,1表示牆。

現在輸入乙個道路的座標作為起點,再如輸入乙個道路的座標作為終點,

問最少走幾步才能從起點到達終點?

(注:一步是指從一座標點走到其上下左右相鄰座標點,

如:從(3,1)到(4,1)。)

第一行輸入乙個整數n(0輸入

23 1 5 7

3 1 6 7

輸出12

11我們可以使用dfs的思想來解決這題,從乙個點出發,嘗試所有的走法,輸出最小的

**如下:

#includeusing namespace std;

int mmap[9][9]=,,,

,,,,

,},next[4][2]=,,,},x,xx,y,yy,step=0,minn=999999;//列印地圖,next為下一次的前後左右走法

void dfs(int x1,int x2,int y1,int y2,int step)

if(mmap[x1][y1]==1)

if(mmap[x1][y1]==0)

}return;

}int main()

return 0;

}

深度優先搜尋DFS

作為搜尋演算法的一種,dfs對於尋找乙個解的 np 包括npc 問題作用很大。但是,搜尋演算法畢竟是 時間複雜度是o n 的階乘級演算法,它的效率比較低,在資料規模變大時,這種演算法就顯得力不從心了。關於深度優先搜尋的效率問題,有多種解決方法。最具有通用性的是剪枝 prunning 也就是去除沒有用...

深度優先搜尋 DFS

深度優先搜尋 縮寫dfs 有點類似廣度優先搜尋,也是對乙個連通圖進行遍歷的演算法。它的思想是從乙個頂點v 0開始,沿著一條路一直走到底,如果發現不能到達目標解,那就返回到上乙個節點,然後從另一條路開始走到底,這種盡量往深處走的概念即是深度優先的概念。你可以跳過第二節先看第三節,還是引用上篇文章的樣例...

深度優先搜尋(dfs)

深度優先搜尋的一般步驟 1 從頂點v出發,訪問v。2 找出剛才訪問過的頂點的第乙個未被訪問的鄰接點,訪問該頂點。以該頂點為新頂點,重複此步驟,直到剛訪問的頂點沒有沒有未被訪問過的鄰接點為止。3 返回前乙個訪問過的仍有未被訪問過的鄰接點的頂點,找出該頂點的下乙個未被訪問過的鄰接點,訪問該頂點。4 重複...