深度優先搜尋屬於圖演算法的一種,英文縮寫為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不同,在記...