記一下學習BFS之後的小筆記以及虛擬碼
阿新 • • 發佈:2018-12-19
BFS,全稱Breadth First Search,寬度優先搜尋演算法(又稱廣度優先搜尋)。 運用佇列先進先出的特點來遍歷所有情況。由於是寬度優先,所以會一層一層遍歷所有情況,可以以此特性來求解搜尋路徑的最小值。
虛擬碼(我理解中的):
/* * 首先先定義需要搜尋的每一個點或者每一種情況, * (如需求最小路徑,則添加當前步數step) */ struct location{ int x; //定義需要搜尋位置的資訊。 int y; //如搜尋迷宮,則定義橫縱座標。 int step; //到達當前位置所進行的步數。 }; location lo[N][N]; int cmp[] = {n1,n2,m1,m2,k1,k2,z1,z2} // 所有滿足情況的判斷條件集合,也可以寫成if語句 //但是會增加很多程式碼量。 int flag[N][N]; //當一個點被遍歷以後,為其做上標記,防止重複遍歷,極大減小運算量。 int bfs(){ queue<location> q; //建立一個佇列; location cur,next; //該佇列中只需要兩個變數即可,當前變數和當前變數的子變數。參考二叉樹之類~ int fx,fy; //作為中間變數,用以判斷該位置是否滿足邊界條件或需求,同時用以賦值。 cur.x = first.x; cur.y = first.y; cur.step = 0; //初始化當前變數。 q.push(cur); //將當前變數彈進佇列。初始化完畢。 flag[fist.x][first.y] = 1; //起點位置標記為已經走過。 while(!q.empty()){ //當佇列不為空,表示符合條件的位置還沒有訪問完。 cur = q.front(); q.pop(); //cur指向佇列首,並將其彈出。初始化雖然指向過,但是迴圈體需要! if(滿足搜尋條件){ return 需要的結果; //找到滿足的結果,提前結束迴圈。 } //若不滿足,則找出cur物件的子物件next,將他彈入佇列中。 for(int i = 1; i<=x;i = i+n ){//結合cmp陣列,來考慮需要怎麼迴圈 fx = cmp[i-1] * xxx fy = cmp[i] * xxx; if(fx,fy滿足邊界條件&&flag[fx][fy]!=1&&滿足其他必須條件){ flag[fx][fy] = 1; //遍歷該點,並彈入佇列內; next.x = fx; next.y = fy; next.step = cur.xtep +1; q.push(next); //至此結束 } } } return 不存在結果的情況。 //如果所有情況都不滿足,則佇列為空了。返回相應結果。 }
推薦一些練習題:hdoj 1253, hdoj 2717 ,hdoj 1312,hdoj 1495
以後有新的想法再更新這個筆記,加油~~