通過一定的順序,列舉每乙個資料(經常會通過一些判斷條件去掉無意義的資料,即剪枝),找到想要的資料的過程。 迷宮
以迷宮為例:
如圖,左上角是起點,右下角是終點。如果給我們做,我們可以一眼看出答案,但是電腦卻很難「看」出來,因為電腦一次只能看乙個格。所以就需要乙個乙個格仔去看是否能走,一直找到中間點。
如果我們規定只能走上下左右,並且按照深搜的規定,每次選擇按照「上下左右」的順序走,這樣在起點就有下和右兩個方向可以走,先選擇向下走:
走完後,有上、下、右三個方向可以走,但是上已經走過了,所以還是只有下、右可以走,繼續向下走………………
已經沒有路可以走了,這時就要進行回溯,即往回走,一直回溯到上一次有兩條路可以選擇的時候
也就是這個時候,繼續按照之前的方法走,遇到路口按照「上、下、左、右」的順序選擇方向、遇到死路就回溯,這樣可以一直找到終點。
偽**dfs是以遞迴為基礎的
void
dfs(
)//遞迴主體
for(……)
}}
廣度優先搜尋是連通圖的一種遍歷演算法,這一演算法也是很多重要的圖的演算法的原型。dijkstra單源最短路徑演算法和prim最小生成樹演算法都採用了和廣度優先搜尋類似的思想,屬於一種盲目搜尋法,目的是系統的展開並檢查途中的所有節點,以找尋結果。換句話說,他並不考慮結果的可能位置,徹底的搜過整張圖,直到找到結果為止。基本過程,bfs是從根節點開始,沿著樹(圖)的寬度遍歷樹(圖)的節點。如果所有演算法均被訪問,則演算法終止。一般用佇列資料結構來輔助實現bfs演算法。與深度優先搜尋的不撞南牆不回頭不同,廣度優先搜尋更像是步步為營,每次把所有能走的點都存在佇列中,然後一一拿出來,看看拿出來的點所能走到的點,把能走到的點再存進佇列,這樣在迷宮中」鋪「出路來。
迷宮還是那個迷宮
首先,起點能走的點有右和下,存進佇列
從佇列中取出點,尋找下一層能走的點。
依次往下找,直到找到終點。
偽**
q.
push
(起點)
;//將起點推入佇列
while
(!q.
empty()
)}
例題
//方向陣列
int xx[4]
=;int yy[4]
=;//圖的長寬
int l,w;
//存圖的字串陣列
char _map[50]
[50];
//步數
int step =1;
int minn =
2500
;//bfs用到的結構體,表示乙個座標
struct node};
//深搜
void
dfs(
int x,
int y)
for(
int i =
0;i <
4;i++)}
}//廣搜
void
bfs(
)for
(int i =
0;i <
4;i++)}
}}intmain()
/*5 5
..###
#....
#.#.#
#.#.#
#.#..
*/poj3984 迷宮問題
poj3278 catch that cow
hdu1241 oil deposits
poj3414 pots
poj4116:拯救行動
hdu 1180 詭異的樓梯
poj2488:a knight』s journey
搜尋(深搜 廣搜)
我記得在遙遠的2017年,我會敲的搜尋也只有暴力列舉了。那個時候的我深搜剛會一丟丟,所以也只配切切水題,然而經常死迴圈re那是肯定的。如今的我因為在多次比賽中都死於搜尋,那就必須得認真磕一下了。其實是這樣的 我眼裡認為的暴力就真的只是暴力,暴力無非就兩種 列舉打表和模擬。然而在這麼多次比賽後,我總能...
廣搜與深搜演算法
bfs 廣度優先搜尋 從起點開始,檢視與其相鄰並且滿足題中條件的周圍的所有點 第一層點 然後再以他們為 起點 再去檢視與他們相鄰的第二層的點,一層一層的遍歷,直到找到目標。廣搜一般用於尋找最小路徑等型別題目,因為是層層尋找,所以尋找到的目標一定是最好的解,其大概過程如同一滴水滴到水池產生的水波。但是...
廣搜和深搜
一般來說,廣搜常用於找單一的最短路線,或者是規模小的路徑搜尋,它的特點是 搜到就是最優解 而深搜用於找多個解或者是 步數 已知 好比3步就必需達到前提 的標題,它的空間效率高,然則找到的不必定是最優解,必需記實並完成全數搜尋,故一般情況下,深搜需要很是高效的剪枝 優化 像搜尋最短路徑這些的很顯著若是...