DFS的個人理解和測試例題

2021-08-18 20:56:30 字數 1840 閱讀 1359

例如下圖:

從a(起點)開始走,先走abd

在d處發現沒有子節點,推後到節點b,去走eg

到節點g發現又到了盡頭,然後退一步到節點e,發現節點e沒有右節點

再退到節點b,發現b的左右節點都走過了,再退到節點a,去走ac

節點c沒有左子樹,走右子樹f,f是盡頭,退到c,退到a,返回。

有三個方面,分別是輸入資料、狀態轉換圖、求解目標;

輸入資料:如果是遞迴資料結構,如單鏈表,二叉樹,集合,則百分之百可以使用深搜;如果是非遞迴資料結構,比如一維陣列、二維陣列、字串、圖,則概率要小一些;

狀態轉換圖:樹或者圖;

輸入資料:必須要走到最深(比如對於樹,必須要走到葉子結點)才能得到乙個解,這種情況比較適合用深搜;

給定整數a1,a2.....an,判斷是否可以從中選出若干數,使他們的和恰好為k。

(限制條件:1<=n<=20,-10

8<=10

8,-10

8<=k<=108)

簡單的dfs運用,每個資料都用兩種選擇:加上或者不加,時間複雜度:2

n。**:

#define max_n 1005

int data[max_n];

int n,k;

// 從前i項得到的和sum

bool dfs(int i,int sum)

結果:

嗯,乙個簡單的小例子,就算是比賽一般也就大一前3題吧。

例題2:

有乙個大小為n * m的院子,雨後積起了水。

『w』代表積水,'.'代表沒有積水。

八連通的積水被認為是連線在一起的。請求出院子裡總共有多少水窪?

(限制條件:n,m<=100)

(八連通表示:上,下,左,右,左上,左下,右上,右下都屬於直接連通。下圖相對於w的*部分

)* * *

*w** * *

**:

#define max_n 100

int n,m;

int map[100][100];

void dfs(int x,int y)

{ map[x][y] = '.'; // 判斷過的位置變為'.'沒有積水

// 判斷連通的八個位置

for(int dx=-1;dx<=1;dx++)

for(int dy=-1;dy<=1;dy++)

{ int nx = x + dx;

int ny = y + dy;

if(map[nx][ny] == 'w' && nx>=0 && nx=0 && ny結果:

測試的資料:

10 12

w........ww.

.www.....www

....ww...ww.

.........ww.

.........w..

..w......w..

.w.w.....ww.

w.w.w.....w.

.w.w......w.

..w.......w.

一會兒會更新bfs,最近看動態規劃有點迷惑,可能會晚一些。

DFS和BFS典型例題

dfs模板 void dfs 引數用來表示狀態 if 越界或者不合法狀態 return else 全排列 include include int v 1005 a 1005 n void dfs int c else int main return0 素數環 include include int ...

理解區間dp和例題

一 講解 1 作用 用於不知道從 合併的動態規劃題,不比線性dp 2 解法步驟 即列舉區間長度,再列舉左端點,之後列舉區間的斷點進行轉移。3 核心思路 既然讓我求解在乙個區間上的最優解,那麼我把這個區間分割成乙個個小區間,求解每個小區間的最優解,再合併小區間得到大區間即可。所以在 實現上,我可以列舉...

滲透測試流程 個人理解

因此我所要寫的也是ptes滲透測試執行標準。它包括以下7個階段。值得說的一點是,執行標準也只是乙個參考工具,用於指導下一步應該幹嘛。有些不必的則可以跳過,或是回到上一步。極其重要的第一階段,主要在於與客戶確認需求及測試範圍和等。主要分為被動和主動兩部分。被動是指不與目標直接互動,通過其他路徑獲得目標...