BFS總結

 注意

  • vis數組,否則循環就不用結束了
  • 使用queue容器前記得清空
  • check函數記得判斷邊界

必須要先標記訪問再入隊列!!!不能先入隊列等出隊時再標記訪問,這樣節點會重複入隊,並且可能會爆內存!!!

 

 

模板 

struct node//結構體定義
{
	int x,step;
};
queue<node> q;
void bfs()
{
	while(!q.empty()) q.pop();
	node now,next;//now應同時用起始點初始化如now{a,0}
	q.push(now);
	while(!q.empty())
	{
		now = q.front();
		q.pop();
		if(//判斷是否爲結果)
		{
			//輸出結果等
			return;//可別忘了你的死機怎麼來的。。。 
		} 
		for(//遍歷它的兒子們~)
		{
			//通過now得到next
			//如next.x = now.x+dir[i][0];next.y = now.y+dir[i][1];
			if(//vis = 0,滿足條件(不是牆等),不超邊界(否則就非法訪問數組了))
			{
				//一些其他必要的處理,如題中若求多少步那就是next.step = now.step+1; 
				vis = 1;//vis數組可以讓訪問過的不再push進隊列,否則循環就沒完了
                        //並且對於算步數的題,若沒有vis步數就全亂了
				q.push(next);
			}
		} 		
	}
} 

 

幾種不同的類型

  •  求步數類問題,忘了怎麼做就想這張圖

步數

            next.step = now.step+1;//原理就是上面的圖

 

  • 求連通塊類問題

 

  • 記錄路徑類問題

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章