注意
- 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;//原理就是上面的圖
- 求連通塊類問題
- 記錄路徑類問題