深度優先搜尋(DFS)和廣度優先搜尋(BFS)

2021-08-25 05:31:44 字數 2239 閱讀 4394

先說dfs:

關於dfs和bfs的搜尋題目,首先要將其轉化為樹,如迷宮,也可轉化為樹來搜尋

dfs是一條鏈一條鏈的搜尋,而bfs是逐層進行搜尋,這是他倆乙個很大的區別

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

限制條件:

樣例:4    (n);

1 2 4 7    (a陣列)

13     (k)

yes(13 = 2 + 4 + 7)

該題就可以用dfs來進行計算:首先先建樹。 

直到遍歷到最低端為止, 如果不滿足情況,輸出no,若滿足情況,輸出yes

#include#includeusing namespace std;

const int maxn =100;

int n, k;

int a[maxn];

bool dfs(int i, int sum)

int main()

然後說一下bfs,bfs與dfs相類似,也是從某個狀態出發索引所有可以到達的狀態

不同之處在於搜尋的方式不一樣,bfs是一層一層的搜尋。即先搜尋距離近的,通過一次轉移,可以到達這一層的所有狀態,它只從上到下遍歷一次。

bfs利用佇列來進行計算。搜尋時首先將初始狀態新增到佇列裡,此後從佇列的最前端不斷取出狀態,把從該狀態而可以轉移到的狀態(這些狀態還未被訪問)加入到佇列裡,如此重複,直到佇列被取空或找到了問題的解。

最經典的迷宮問題:

給定乙個大小為n * m的迷宮,迷宮由通道和牆壁組成,每一步都可以向鄰接的上下左右四格的通道移動,請求出從起點到終點的最小步數。假設:從起點一定可以到達終點。(s代表起點,g代表終點)

限制條件:      0 <= n <= 100    ,    0 <= m <= 100

輸入:10  10         (n   m)

#s######.#

......##.#

.#.##.##.#

.#........

##.##.####

....#....#

.#######.#

....#.....

.#######.#

....#.....

.####.###.

....#...g#

輸出:

bfs可以用來求最短路徑,最少操作等問題,所以可以用bfs來做

bfs只要將已經訪問過的狀態用標記標註,就可以很好的做到由近及遠搜尋(如果要輸出最短距離,我們可以用乙個二維陣列把他儲存起來,然後再輸出

因為要向四個不同方向移動,可以用dx[4]和dy[4]來表示四個方向。通過迴圈就可以實現四個方向的遍歷

/*求最短路徑*/ 

#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

const int inf = 1000000000;

typedef pairp;

char maze[110][110];

int n, m;

int sx, sy; //起始座標

int gx, gy; //終點座標

int d[100][100];

int dx[4] = ;

int dy[4] = ;

void find(int gx, int gy)

find(d[gx][gy]);

printf("(%d,%d)\n", gx, gy);

}int bfs()

} }

find(gx, gy);

}int main()

return 0;

}

深度優先搜尋(DFS)和廣度優先搜尋(BFS)

深度優先搜尋和廣度優先搜尋都是圖形搜尋演算法,1 深度優先搜尋 是針對圖和樹的遍歷演算法,利用深度優先搜尋演算法可以產生目標圖的相應的拓撲排序表,利用拓撲排序表可以方便的解決了很多相關的圖論問題,如最大路徑問題,一般用堆資料結構來輔助實現dfs 演算法,其過程要來說是對每乙個可能的分支路徑深入到不能...

深度優先搜尋DFS和廣度優先搜尋BFS

注意 用遞迴 其實就是棧 和棧實現。有n個物品,沒見物品的重量為w i 價值為c i 現在需要選出若干件物品放入乙個容器為v的 揹包中,是的在選入揹包的物品重量和不超過容量v的前提下,讓揹包中物品的價值之和最大,求最大價值。void dfs int index,int sumw,int sumc d...

深度優先搜尋(DFS)和廣度優先搜尋(BFS)

排列數字 給定乙個整數n,將數字1 n排成一排,將會有很多種排列方法。現在,請你按照字典序將所有的排列方法輸出。輸入格式 共一行,包含乙個整數n。輸出格式 按字典序輸出所有排列方案,每個方案佔一行。資料範圍 1 n 7輸入樣例 3輸出樣例 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 ...