演算法之路 深搜 廣搜(簡單搜尋)

2021-09-29 13:09:42 字數 2482 閱讀 3858

通過一定的順序,列舉每乙個資料(經常會通過一些判斷條件去掉無意義的資料,即剪枝),找到想要的資料的過程。 迷宮

以迷宮為例:

如圖,左上角是起點,右下角是終點。如果給我們做,我們可以一眼看出答案,但是電腦卻很難「看」出來,因為電腦一次只能看乙個格。所以就需要乙個乙個格仔去看是否能走,一直找到中間點。

如果我們規定只能走上下左右,並且按照深搜的規定,每次選擇按照「上下左右」的順序走,這樣在起點就有下和右兩個方向可以走,先選擇向下走:

走完後,有上、下、右三個方向可以走,但是上已經走過了,所以還是只有下、右可以走,繼續向下走………………

已經沒有路可以走了,這時就要進行回溯,即往回走,一直回溯到上一次有兩條路可以選擇的時候

也就是這個時候,繼續按照之前的方法走,遇到路口按照「上、下、左、右」的順序選擇方向、遇到死路就回溯,這樣可以一直找到終點。

偽**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步就必需達到前提 的標題,它的空間效率高,然則找到的不必定是最優解,必需記實並完成全數搜尋,故一般情況下,深搜需要很是高效的剪枝 優化 像搜尋最短路徑這些的很顯著若是...