注意
- 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;//原理就是上面的图
- 求连通块类问题
- 记录路径类问题