深度優先搜尋

2021-10-23 05:28:56 字數 3395 閱讀 8049

深度優先搜尋,簡稱dfs。我們可以將它跟遞迴聯合在一起。

先回顧一下遞迴。

我們使用遞迴完成斐波那契數列的計算:

1int fib(int n)

5    return fib(n - 1) + fib(n - 2);

6}

以上遞迴實現斐波那契實際上就是按照深度優先的方式進行搜尋。也就是 「一條路走到黑」 。注意:這裡的搜尋指的是一種窮舉方式,把可行的方案都列舉出來,不斷嘗試,直到找到問題的解。

以上即為fib(5)的計算過程,我們發現實際上對應著一棵樹,這棵樹被稱為搜尋樹

深度優先搜尋與遞迴的區別:

深度優先搜尋是一種演算法,更注重思想。

遞迴是一種基於程式語言的實現方式。

深度優先搜尋可以使用遞迴實現!當然也就存在非遞迴的的方式實現搜尋。

dfs解法:首先找到起點s,走到每個點時,按照左、下、右、上的順序嘗試。每走到下乙個點以後,我們把這個點當作起點s,繼續順序嘗試。如果某個點上下左右四個方向都嘗試過,便回到走到這個點的之前點,稱為回溯。然後繼續嘗試其他方向,直到所有點都嘗試過上下左右四個方向。

**實現:

首先要處理好邊界條件,即什麼時候搜尋結束。

1if(maze[x][y] == 't')
另外,為了方式走回頭路,我們還需要標記當前點已經走過了,所以需要乙個vis陣列來做標記。同時為了標記出來路徑,我們使用」m「進行地圖上的標記。

1vis[x][y] = 1;

2maze[x][y] = 'm';

前面兩步已經完成當前節點的操作了,接下來是要進行走下一步的操作。先往左走看看。

1int tx = x - 1, ty = y;

2if(in(tx, ty) && maze[tx][ty] != '*' && !vis[tx][ty])

7}

向下走。

1int tx = x, ty = y - 1;

2if(in(tx, ty) && maze[tx][ty] != '*' && !vis[tx][ty])

7}

向右走。

1int tx = x + 1, ty = y;

2if(in(tx, ty) && maze[tx][ty] != '*' && !vis[tx][ty])

7}

向上走。

1int tx = x, ty = y + 1;

2if(in(tx, ty) && maze[tx][ty] != '*' && !vis[tx][ty])

7}

如果路走不通的話,一定要取消一下m標記,標記成」.「障礙物。

1vis[x][y] = 0;

2maze[x][y] = '.';

3return false;

最後寫一下 in(int x, int y) 函式,來判斷是否在地圖內。

完整**

1//迷宮

2#include3using namespace std;

4string maze[110];

5bool vis[110][110];

6int n, m;

7bool in(int x, int y)

10bool dfs(int x, int y)

14    vis[x][y] = 1;

15    maze[x][y] = 'm';

16    int tx = x - 1, ty = y;

17    if(in(tx, ty) && maze[tx][ty] != '*' && !vis[tx][ty])

22    }

23    int tx = x, ty = y - 1;

24    if(in(tx, ty) && maze[tx][ty] != '*' && !vis[tx][ty])

29    }

30    int tx = x + 1, ty = y;

31    if(in(tx, ty) && maze[tx][ty] != '*' && !vis[tx][ty])

36    }

37    int tx = x, ty = y + 1;

38    if(in(tx, ty) && maze[tx][ty] != '*' && !vis[tx][ty])

43    }

44    vis[x][y] = 0;

45    maze[x][y] = '.';

46    return false;

47} 

48int main()

54    int x, y;

55    //找到起始點 

56    for(int i = 0; i 

61        }

62    }

63    if(dfs(x, y)), , , };

這裡建議使用逆時針或者順時針的記錄,方便使用向左轉向右轉的實現。

然後使用for迴圈依次考慮四個方向。

1for(int i = 0; i 

9   }

10}

從而減少了**量。

前面我們只是尋找了是否有可行的路徑,現在需要求最少多少步即可到達。

我們使用乙個引數來記錄前面引數以及走了多少步:step。

1int ans = 10000000000;//結果

2void dfs(int x, int y, int step)

7        return;

8    }

9    vis[x][y] = 1;

10    maze[x][y] = 'm';

11    for(int i = 0; i 

18    }

19    vis[x][y] = 0;//取消標記 

20}

ok,明天繼續。

卡尼慕kanimu

掃碼關注我

廣度優先搜尋 深度優先搜尋

前言 這幾天複習圖論演算法,覺得bfs和dfs挺重要的,而且應用比較多,故記錄一下。廣度優先搜尋 有乙個有向圖如圖a 圖a廣度優先搜尋的策略是 從起始點開始遍歷其鄰接的節點,由此向外不斷擴散。1.假設我們以頂點0為原點進行搜尋,首先確定鄰接0的頂點集合s0 2.然後確定頂點1的集合s1 頂點2沒有鄰...

廣度優先搜尋,深度優先搜尋

深度優先搜尋 depth first search 簡稱dfs。最直觀的例子就是 走迷宮 廣度優先搜尋 每個頂點都要進出一遍佇列,每個邊也都會被訪問一次,所以 時間複雜度o v e 主要消耗記憶體的是visited prev陣列 queue佇列,所以 空間複雜度o v 深度優先搜尋 每條邊最多會被訪...

深度優先搜尋 廣度優先搜尋

深度優先搜尋 廣度優先搜尋 通過鄰接矩陣對圖進行深搜和廣搜 package com.neusoft.data.structure 深度優先搜尋 廣度優先搜尋 通過鄰接矩陣對圖進行深搜和廣搜 public class dfsbfs 初始化 邊 mmatrix new int vlen vlen for...