C語言 DFS 深度優先搜尋演算法 詳解

2021-10-02 15:31:58 字數 1644 閱讀 8996

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

回溯法(探索與回溯法)是一種選優搜尋法,又稱為試探法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。

int check(引數)

void dfs(int step)

嘗試每一種可能

}

1、全排列問題

//全排列問題

#include#includeint n;

char a[15];

char re[15];

int vis[15];

//假設有n個字元要排列,把他們依次放到n個箱子中

//先要檢查箱子是否為空,手中還有什麼字元,把他們放進並標記。

//放完一次要恢復初始狀態,當到n+1個箱子時,一次排列已經結束

void dfs(int step)

for(i=1;i<=n;i++)//遍歷每一種情況

}return ;}

int main(void)

return 0;

}

2、乙個環由個圈組成,把自然數1,2,…,n分別放在每乙個圓內,數字的在兩個相鄰圈之和應該是乙個素數。 注意:第一圈數應始終為1。

input: n(0~20)

output:輸出格式如下所示的樣品。每一行表示在環中的一系列圓號碼從1開始順時針和按逆時針方向。編號的順序必須滿足上述要求。列印解決方案的字典順序。

//prime ring problem

//與上面的全排列問題其實思路差不多,只是需要判斷的條件比較多

//化大為小

#include#include#includeint book[25];

int result[25];

int n;

int num;

//判斷是否為素數

int prime(int n)

if(i*i>n)

return 1;

return 0;

}//判斷是否能將當前的數字放到當前的圈內

int check(int i,int step)

return 1;

}return 0;}

void dfs(int step)

,,,,,,,};//表示8個方向

int check(int x,int y)//檢查是否有油田

for(int i=r; i

}} int main(void)

dfs(0, k);//從第0行開始放,此時手中還剩k個棋子

printf("%d\n", ans);

}return 0;

}

深度優先搜尋演算法(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的那條邊的起始節點。整個程序反覆進行直到所有節點都被訪問為止。屬於盲...