DFS(深度優先搜尋) (C )

2021-10-23 19:38:22 字數 2725 閱讀 5865

1、演算法用途

用於遍歷圖中的節點,有些類似於樹的深度優先遍歷。這裡唯一的問題是,與樹不同,圖形可能包含迴圈,因此我們可能會再次來到同一節點。

2、 基本思想

深度優先遍歷圖的方法是,從圖中某頂點v出發:

(1)訪問頂點v;

(2)依次從v的未被訪問的鄰接點出發,對圖進行深度優先遍歷;直至圖中和v有路徑相通的頂點都被訪問;

(3)若此時圖中尚有頂點未被訪問,則從乙個未被訪問的頂點出發,重新進行深度優先遍歷,直到圖中所有頂點均被訪問過為止。 當然,當人們剛剛掌握深度優先搜尋的時候常常用它來走迷宮.事實上我們還有別的方法,那就是廣度優先搜尋(bfs).

3.經典例題

acwing 842. 排列數字

給定乙個整數n,將數字1~n排成一排,將會有很多種排列方法。

現在,請你按照字典序將所有的排列方法輸出。

輸入格式

共一行,包含乙個整數n。

輸出格式

按字典序輸出所有排列方案,每個方案佔一行。

資料範圍

1≤n≤7

輸入樣例:

3
輸出樣例:

123

1322

1323

1312321

#include

using

namespace std;

const

int n =10;

int n;

int path[n]

;bool st[n]

;//檢驗哪個點被用過

void

dfs(

int u)

//當ufor

(int i =

1; i <= n; i++)if

(!st[i]

)//找到乙個沒有被用過的數

}int

main()

acwing 843. n-皇后問題

n-皇后問題是指將 n 個皇后放在 n∗n 的西洋棋棋盤上,使得皇后不能相互攻擊到,即任意兩個皇后都不能處於同一行、同一列或同一斜線上。

現在給定整數n,請你輸出所有的滿足條件的棋子擺法。

輸入格式

共一行,包含整數n。

輸出格式

每個解決方案佔n行,每行輸出乙個長度為n的字串,用來表示完整的棋盤狀態。

其中」.」表示某乙個位置的方格狀態為空,」q」表示某乙個位置的方格上擺著皇后。

每個方案輸出完成後,輸出乙個空行。

輸出方案的順序任意,只要不重複且沒有遺漏即可。

資料範圍

1≤n≤9

輸入樣例:

4
輸出樣例:

.q...

..qq..

...q..

.q.q...

...q.q.

.

題解:每一行只能放乙個皇后,看每一行的皇后能放到哪個位置

//對角線個數2n

int n;

char g[n]

[n];

bool col[n]

, dg[n]

,udg[n]

;//正對角線,反對角線,列

void

dfs(

int u)

for(

int i =

0; i < n; i++)if

(!col[i]

&&!dg[u + i]

&&!udg[n - u + i]

)//列,對角線,反對角線都沒放過

}int

main()

#include

using

namespace std;

const

int n =10;

int n;

bool row[n]

, col[n]

, dg[n *2]

, udg[n *2]

;char g[n]

[n];

void

dfs(

int x,

int y,

int s)

//s表示放皇后的個數

return;}

//不放皇后

g[x]

[y]=

'.';

dfs(x, y +

1, s)

;//放皇后if(

!row[x]

&&!col[y]

&&!dg[x + y]

&&!udg[x - y + n])}

intmain()

47097

/

深度優先搜尋DFS

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

深度優先搜尋 DFS

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

深度優先搜尋(dfs)

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