c語言 DFS演算法 遞迴呼叫

2021-08-17 17:25:39 字數 1547 閱讀 3675

深度優先搜尋屬於圖演算法的一種,英文縮寫為dfs即depth first search.

其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個

節點只能訪問一次

深度優先演算法dfs

模型(以二維直角座標來舉例)

void dfs(int dep)dep表示深度 

; // 方向向量,(x,y)周圍的四個方向

bool checkedge(int x,int y) // 邊界條件和約束條件的判斷

void dfs(int x,int y)

for(int i=0;i<4;i++)

return; // 沒有下層搜尋節點,回溯

}int main()

*例題1:方格分割(第八屆藍橋杯省賽題目)

6x6的方格,沿著格仔的邊線剪開成兩部分。

要求這兩部分的形狀完全相同。

如圖:p1.png, p2.png, p3.png 就是可行的分割法。

試計算:

包括這3種分法在內,一共有多少種不同的分割方法。

注意:旋轉對稱的屬於同一種分割法。

請提交該整數,不要填寫任何多餘的內容或說明文字。

思路:可以用分割格仔的線來求,因為線也是關於(3,3)點對稱的,

所以可以初始化從點(3,3)開始用深搜同時走對稱的兩條線。 

因為旋轉對稱屬於同一種分法,所以求得的結果除以4即是答案*/

#includeusing namespace std;

int dir[4][2] = ; //定義乙個二維陣列來存放搜尋方向

const int maxn=8;

int vis[maxn][maxn];

int ans = 0; //ans統計次數

void dfs(int x, int y)

for(int i = 0; i < 4; i++)

} }

}

int main()

例題2:

【問題描述】

小明最近喜歡搭數字積木。一共有10塊積木,每個積木上有乙個數字,0~9。

搭積木規則:

每個積木放到其它兩個積木的上面,並且一定比下面的兩個積木數字小。

最後搭成4層的金字塔形,必須用完所有的積木。

01 2

3 4 5

6 7 8 9

請你計算這樣的搭法一共有多少種?

#include#includeint visited[10]=; //檢視該元素是否被訪問 全部賦值為0

int a[10]=;

int sum=0; //定義全域性變數sum來進行對符合條件的組合計數

int test(int n){ //判斷基本符合條件

if(n==2){ //當三個積木 第二層時

if(a[0]

非遞迴dfs演算法

都說現今記憶體不值錢了,哈,也就不考慮空間複雜度的問題了,弄了倆輔助陣列,覺得解這題還是挺容易的,就是不知道有沒有bug。問題描述 假設圖g採用鄰接表儲存,編寫乙個實現連通圖g的深度優先遍歷 從頂點v出發 的非遞迴演算法。演算法思路 就是深度優先的思路。同樣是乙個visited陣列,標記已訪問過的頂...

非遞迴dfs演算法

都說現今記憶體不值錢了,哈,也就不考慮空間複雜度的問題了,弄了倆輔助陣列,覺得解這題還是挺容易的,就是不知道有沒有bug。問題描述 假設圖g採用鄰接表儲存,編寫乙個實現連通圖g的深度優先遍歷 從頂點v出發 的非遞迴演算法。演算法思路 就是深度優先的思路。同樣是乙個visited陣列,標記已訪問過的頂...

c語言呼叫cpp函式 C語言 函式的遞迴呼叫

乙個函式在呼叫的過程 現直接或者間接呼叫該函式本身的情況,稱為遞迴呼叫,這種函式稱為遞迴函式 在寫遞迴函式時,需要解決如下兩個問題 1 遞迴的出口條件 2 遞迴公式 遞迴函式的 一般為 if 遞迴出口條件 返回符合出口條件的函式值或輸出結果 else 遞迴公式 雖然演算法一致,但n不同,y不同,在記...