【bfs演算法工作機制】
由一點引起的、對周圍的資料進行盲目搜尋(即無權值路徑),根據這一點bfs更多用於座標化的迷宮,或者不需要考慮有關路徑權值大小的圖形等的抽象搜尋問題。
可以將bfs的過程想象成水波的漣漪
即若每乙個搜尋中心即水波的中心,則從該搜尋中心出發經由的搜尋點則是同一漣漪環上的點。然後漣漪上的點又充當新的搜尋中心,以此類推。
(每一點的數字表示搜到該點的最短單位時間)
【實現機制】
bfs的實現通常通過佇列queue實現。先向queue中加入初始的搜尋起點,然後通過設立具有串聯性質的cur和next元素(當然對於同一cur,next1與next2之間屬於併聯關係),不斷彈出、加入,直至搜尋到所需目標或者元素全部彈光為止。若中途搜到所需目標則搜尋成功,反之則失敗。
其中,由於在實際應用中bfs搜尋的方向非常多,為了防止memory limit excessive,需要使用另外的剪枝陣列防止發生不必要的回溯來避免其記憶體的占用
【變數設計】
佇列包含元素的設計:絕大部分使用結構體作為每一步的載體。由於佇列中的每乙個元素需要同時包含當前一步中①需要實時更新並且對結果有影響的變數②用於判斷是否搜到所需目標的變數③搜到目標時的返回值(即所需值)④一些每一步都需要進行操作的函式(不是必須的)
剪枝陣列的設計:核心問題是哪些變數能夠共同唯一地定義某一步(即當這些變數相同時才能夠準確無誤地認為這一步已經走過、從而不需要將其加入que中),而這些變數的總數決定了陣列的維度,每一維用於表示某一變數的值。
【做題反思】
1.仔細讀題,注意多組測試資料的時候,若同一題用的是同一佇列,則要先清空前一組中佇列裡剩下的元素。
2.注意判斷每乙個next是否要放入que中時,判斷的層次性,並且注意討論的全面性。
3.在簡單的地圖中判斷某一點是否搜尋過時,搜到該點最短的時間=>該點是否被搜過;另外,由於bfs嚴格的串聯關係,串聯關係上的元素搜尋所需時間嚴格遞增,併聯關係上的元素搜尋所需時間嚴格相等,即某一點的搜尋最短時間一旦被確定下來就不會再改變。這兩點在具體的程式設計中會體現出來,在設計變數、程式時也可以根據此來安排。
【常用變數、常量】
int direct[4][2]=,,,};
typename graph[x][y]; //表示地圖
bool hush[x][y]; //剪枝陣列
struct node
【常用偽**】
bool bfs()}}
return false;
}
【結語】
是寒假刷完的第乙個專題…刷了整整一周但是收穫的確還是很大的,比如之前寫的雙bfs推箱子也可以試著用bfs+dfs來寫寫看、等等。
真正比賽的時候搜尋的應用變化多端而且有些還是抽象的運用,所以要不斷提高自己對於複雜搜尋問題的敏感性、培養搜尋建模的能力。
HDOJ 2019 數列有序!
題目鏈結 problem description 有n n 100 個整數,已經按照從小到大順序排列好,現在另外給乙個整數x,請將該數插入到序列中,並使新的序列仍然有序。input 輸入資料報含多個測試例項,每組資料由兩行組成,第一行是n和m,第二行是已經有序的n個數的數列。n和m同時為0標示輸入資...
(HDOJ2019)數列有序
problem description 有n n 100 個整數,已經按照從小到大順序排列好,現在另外給乙個整數x,請將該數插入到序列中,並使新的序列仍然有序。input 輸入資料報含多個測試例項,每組資料由兩行組成,第一行是n和m,第二行是已經有序的n個數的數列。n和m同時為0標示輸入資料的結束,...
(HDOJ2019)數列有序
problem description 有n n 100 個整數,已經按照從小到大順序排列好,現在另外給乙個整數x,請將該數插入到序列中,並使新的序列仍然有序。input 輸入資料報含多個測試例項,每組資料由兩行組成,第一行是n和m,第二行是已經有序的n個數的數列。n和m同時為0標示輸入資料的結束,...