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那是肯定的。如今的我因為在多次比賽中都死於搜尋,那就必須得認真磕一下了。其實是這樣的 我眼裡認為的暴力就真的只是暴力,暴力無非就兩種 列舉打表和模擬。然而在這麼多次比賽後,我總能...