注意點:是否越界,是否為障礙物,是否已經訪問過···記錄訪問可以設定標記陣列b[i];
因為行是遞增(不一定是加1)往下存放棋子的,故只要儲存列的狀態就可以保證列和行都不重複;如果我們逐行放置皇后/棋子,則肯定沒有任意兩個皇后/棋子位於同一行,只需要判斷列和對角線即可。
標記陣列可以設為int型(0/1),也可以設為bool型(false/ture)
嘗試結束要取消這個點的標記;
如果是visit[i]這種標記,回溯後i點應該視為沒訪問過,所以需要還原,不管是全域性變數還是區域性;模擬/因為在上一次擺放嘗試結束後,如果不把剛剛放入棋盤的棋子收回,那將無法進行下一次擺放。
history[i]這種,用來記錄第i點的值(顏色或者數字...),一般回溯到i之前的點時,第i點的取值就無所謂了,對dfs遞迴不影響,所以不用還原,還原也不會錯;
int ans這種記錄全域性的變數,全域性變數需要還原,區域性不需要;
暴力搜尋:又稱列舉演算法:列舉問題的所有狀態從而尋找符合問題的解的方法。適用於狀態較少,比較簡單的問題上。
廣度優先搜尋:
深度優先搜尋:
一般設定乙個棧
stack
,將起始節點放入棧中,然後從棧中彈出乙個節點,檢查是否是目標節點,如不是則進行擴充套件,將擴充套件出的所有節點入棧,然後再從棧頂彈出乙個節點,直到找到目標節點。
深度優先搜尋得到的第乙個解,不一定是最優解。
a*演算法
利用問題的規則和特點來制定一些啟發規則,由此來改變節點的擴充套件順序,將最有希望擴充套件出最優解的節點優先擴充套件,使得盡快找到最優解。
對每乙個節點,有乙個估價函式f來估算起始節點經過該節點到達目標節點的最佳路徑的代價。
每個節點擴充套件的時候,總是選擇具有最小的f的節點。
f=g+b×h:g為從起始節點到當前節點的實際代價,已經算出,h為從該節點到目標節點的最優路徑的估計代價。f要單調遞增。
b最好隨著搜尋深度成反比變化,在搜尋深度淺的地方,主要讓搜尋依靠啟發資訊,盡快的逼近目標,而當搜尋深的時候,逐漸變成廣度優先搜尋
回溯演算法:
和深度優先相似,不同之處在於對乙個節點擴充套件的時候,並不將所有的子節點擴充套件出來,而只擴充套件其中的乙個。因而具有盲目性,但記憶體占用少。
搜尋中的優化:
A 搜尋演算法
啟發式搜尋演算法 要理解 a 搜尋演算法,還得從啟發式搜尋演算法開始談起。所謂啟發式搜尋,就在於當前搜尋結點往下選擇下一步結點時,可以通過乙個啟發函式 來進行選擇,選擇代價最少的結點作為下一步搜尋結點而跳轉其上 遇到有乙個以上代價最 少的結點,不妨選距離當前搜尋點最近一次展開的搜尋點進行下一步搜尋 ...
A 搜尋演算法
a 演算法是基於bfs的一種入門級啟發式搜尋演算法,就是將bfs的佇列改為基於估價的優先佇列,可以快速地找到答案。優先隊列為小根堆 while 優先佇列不為空 取出隊頭並擴充套件 將擴充套件節點以估價值 當前值為優先順序入隊 endwhile估價函式越接近真實值演算法越優,但一定不能大於真實值,否則...
搜尋演算法小結
搜尋演算法是利用計算機的高效能來有目的的窮舉乙個問題的部分和所有的可能情況,從而求出問題的解的一種方法。常用的搜尋演算法有 一.回溯法 回溯演算法是所有搜尋演算法中最為基本的一種演算法,其採用了一種 走不通就掉頭 思想作為其控制結構,其相當於採用了先根遍歷的方法來構造解答樹,可用於找解或所有解以及最...