深度優先搜尋演算法DFS

2021-10-21 06:03:52 字數 1827 閱讀 3380

深度優先搜尋每一次搜尋都要走到底的(從左到右遍歷, 每一次遍歷從上到下遍歷完), 深度優先搜尋主要用遞迴實現, 因此也很容易超時.

回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就「回溯」返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。

既然看到了回溯, 就順便講講回溯的典型題目(典型中的典型)。

八皇后問題:

題目描述:在西洋棋棋盤上放置八個皇后,皇后可以在橫、豎、斜線上不限步數地吃掉其他棋子。要求每兩個皇后之間不能直接吃掉對方。

按給定順序和格式輸出所有八皇后問題的解。

樣例 :

no. 1

1 0 0 0 0 0 0 0

0 0 0 0 0 0 1 0

0 0 0 0 1 0 0 0

0 0 0 0 0 0 0 1

0 1 0 0 0 0 0 0

0 0 0 1 0 0 0 0

0 0 0 0 0 1 0 0

0 0 1 0 0 0 0 0

省略…思路:用乙個一維陣列儲存每個皇后的座標(如:a[3

]a[3]

a[3]

= 55

5表示有乙個皇后在三行五列)再列舉每乙個皇后的位置。

如果是單純的暴力列舉, 時間複雜度到了百億的級別, 是非常恐怖的。但是其中有很多是可以優化的, 比如不能再同一行列, 就優化到了十六萬左右。

但是不能處於同一對角線有一點棘手,怎麼辦呢?我們列乙個表, 記錄行列的差值01

2345

6781

0123

4567

2-101

2345

63-2-101

2345

4-3-2-101

2345

-4-3

-2-101

236-5

-4-3

-2-101

27-6-5

-4-3

-2-101

8-7-6-5

-4-3

-2-1

0不難發現, 只要兩個位置的行列之差相同, 他們就處於同一對角線。

另一條對角線也是同理(行列之和)01

2345

6781

2345

6789

2345

6789

10345

6789

101145

6789

1011125

6789

1011

121367

891011

1213147

891011

1213

141589

1011

1213

1415

16只要兩個位置的行列之和相同, 他們就處於同一對角線。

具體**如下

#include const int maxn = 8;

int n, x;

int a[100], cnt = 0;

bool l[100], d1[100], d2[100];

void dfs(long long h)

for(int i = 1; i <= maxn; i++)

}}int main()

深度優先搜尋演算法(DFS)

1.深度優先搜尋屬於圖的遍歷演算法的一種,英文縮寫為dfs即depth first search.其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。2.搜尋策略 深度優先遍歷圖的方法是,從圖中某頂點v出發 1 訪問頂點v 2 依次從v的未被訪問的鄰接點出發,對圖進...

DFS深度優先搜尋演算法

例題一 題目大意 約翰的農場被暴風雨給淹沒了,損失很大,他的保險公司將支付給他,但是支付金額取決於被淹沒的最大面積。這個農場是乙個邊長分別為n m的矩形,包含nm個空間,每個空間要麼是幹的,要麼是被淹沒的,一共有k個空間被淹沒。求最大的淹沒面積。ac include include include ...

DFS 深度優先搜尋演算法

深度優先搜尋演算法 depth first search,簡稱dfs 一種用於遍歷或搜尋樹或圖的演算法。沿著樹的深度遍歷樹的節點,盡可能深的搜尋樹的分支。當節點v的所在邊都己被探尋過或者在搜尋時結點不滿足條件,搜尋將回溯到發現節點v的那條邊的起始節點。整個程序反覆進行直到所有節點都被訪問為止。屬於盲...