先說dfs:
關於dfs和bfs的搜尋題目,首先要將其轉化為樹,如迷宮,也可轉化為樹來搜尋
dfs是一條鏈一條鏈的搜尋,而bfs是逐層進行搜尋,這是他倆乙個很大的區別
給定整數a1、a2、a3、..............、an,判斷是否可以從中選出若干個數,使得他們的和恰好為k。該題就可以用dfs來進行計算:首先先建樹。限制條件:
樣例:4 (n);
1 2 4 7 (a陣列)
13 (k)
yes(13 = 2 + 4 + 7)
直到遍歷到最低端為止, 如果不滿足情況,輸出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代表終點)bfs可以用來求最短路徑,最少操作等問題,所以可以用bfs來做限制條件: 0 <= n <= 100 , 0 <= m <= 100
輸入:10 10 (n m)
輸出:#s######.#
......##.#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.#######.#
....#.....
.####.###.
....#...g#
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 ...