例如下圖:
從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個階段。值得說的一點是,執行標準也只是乙個參考工具,用於指導下一步應該幹嘛。有些不必的則可以跳過,或是回到上一步。極其重要的第一階段,主要在於與客戶確認需求及測試範圍和等。主要分為被動和主動兩部分。被動是指不與目標直接互動,通過其他路徑獲得目標...