廣搜與深搜演算法

2021-10-22 18:30:59 字數 901 閱讀 1683

bfs(廣度優先搜尋)——從起點開始,檢視與其相鄰並且滿足題中條件的周圍的所有點(第一層點),然後再以他們為「起點」,再去檢視與他們相鄰的第二層的點,一層一層的遍歷,直到找到目標。

廣搜一般用於尋找最小路徑等型別題目,因為是層層尋找,所以尋找到的目標一定是最好的解,其大概過程如同一滴水滴到水池產生的水波。但是因為每一次都會一次又一次查詢周圍的節點,具有盲目性,某些情況占用大量的空間。

實現:深搜

1.將起始點放入

2.以該起始點向乙個方向開始搜尋,找到下乙個點

3.判斷該點是否滿足題中條件(如界限,是否走過)然後打上標記

4.判斷該點是否為目標點,若是,儲存結果 …

5.如果不是,則以該點為新的乙個起始點重複先前步驟

6.若起始點衍生出的所有情況皆無可能,則清除標記往另乙個方向搜

廣搜(常用佇列和結構體)假設佇列命名為q

1.將起始點放入

2.訪問該點相鄰的所有點(第二層點)處理並進行判斷 (判斷過程如上)

3.再訪問與第二層點相鄰的所有點

4.一直訪問直到訪問完了所有結果或者找到目標答案

1.佇列壓入起始點q.push()

2.依次壓入臨近點進行判斷

3.刪除起始點(刪除上一層)q.pop()

4.再以臨近點為新的起始點,查詢臨近點重複以上步驟

那麼如何判斷已經走完了所有的層呢,就用到q.empty()來判斷是否佇列空了,因為前面步驟寫到將起始點刪除掉,如果走到了最後一層不能再走,刪掉後沒有了,就出迴圈

//大致框架:

int dfs(int k)}}

intbfs()

經典例題

dfs:1.八皇后問題

…bfs:1.細胞問題

深搜與廣搜

深搜是一種一條路走到黑,碰壁就倒退的演算法。運用遞迴思想,如果到了不符合條件的節點就撤回一步,然後再選擇另一條路走下去。如果這個節點的所有路徑都走完了,再撤回一步。最簡單的模板 int x 4 int y 4 上下左右四個方向走。也可以八個方向,這裡我就不寫了。void dfs int fx,int...

廣搜和深搜

一般來說,廣搜常用於找單一的最短路線,或者是規模小的路徑搜尋,它的特點是 搜到就是最優解 而深搜用於找多個解或者是 步數 已知 好比3步就必需達到前提 的標題,它的空間效率高,然則找到的不必定是最優解,必需記實並完成全數搜尋,故一般情況下,深搜需要很是高效的剪枝 優化 像搜尋最短路徑這些的很顯著若是...

搜尋(深搜 廣搜)

我記得在遙遠的2017年,我會敲的搜尋也只有暴力列舉了。那個時候的我深搜剛會一丟丟,所以也只配切切水題,然而經常死迴圈re那是肯定的。如今的我因為在多次比賽中都死於搜尋,那就必須得認真磕一下了。其實是這樣的 我眼裡認為的暴力就真的只是暴力,暴力無非就兩種 列舉打表和模擬。然而在這麼多次比賽後,我總能...