1. 程式人生 > >記一下學習BFS之後的小筆記以及虛擬碼

記一下學習BFS之後的小筆記以及虛擬碼

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

以後有新的想法再更新這個筆記,加油~~