【概述】
广度优先搜索从初始状态 S 开始,利用给定的规则,生成当前状态所有可能的状态,构成的下一层节点,检查是否出现目标状态G,若未出现,就对该层所有状态节点,分别顺序利用规则再次生成再下一层的所有状态节点,对这一层的所有状态节点检查是否出现 G,若未出现,继续按上面思想生成再下一层的所有状态节点,这样一层一层往下展开,直到出现目标状态为止。
广度优先搜索可以采用循环队列或动态链表来处理,其适用于逐层寻找答案。
【具体过程】
广度优先即是要按层数一层一层来遍历,先将一层全部扩展,然后再进行下一层。
过程:
- 每次取出队列首元素(初始状态),进行拓展。
- 把拓展所得到的可行状态都放到队列里面。
- 将初始状态删除。
- 一直进行以上三步直到队列为空。
对应队列情况:
每个方块表示一个状态,浅蓝色的表示遍历了该状态
对应的队列的情况
【搜索框架】
int bfs()
{
初始化,初始状态存入队列;
队列首指针head=0;
队列尾指针tail=1;
do
{
指针head后移一位,指向待扩展结点;
for(i=1;i<=max;i++)//max为产生子结点的规则数
{
if(子结点符合条件)
{
tail指针+1,将新结点存入列尾;
if(新结点与原已产生节点重复)
删去该结点(取消入队,tail指针-1);
else if(新结点是目标结点)
输出并退出;
}
}
}while(head<tail);//队列为空
}
【例题】
- 抓住那头牛(信息学奥赛一本通-T1253):点击这里
- 同题:Catch That Cow(POJ-3278):点击这里
- Knight Moves(HDU-1372):点击这里
同题:Knight Moves(信息学奥赛一本通-T1257):点击这里 - 细胞(信息学奥赛一本通-T1329):点击这里
- 流感传染(信息学奥赛一本通-T1191):点击这里
- 最少步数(信息学奥赛一本通-T1330):点击这里
- 马的遍历(洛谷-P1443):点击这里
- A strange lift(HDU-1548):点击这里
- Find The Multiple(POJ-1426):点击这里
- Vova and Train(CF-1066A):点击这里
- 山峰和山谷(信息学奥赛一本通-T1454):点击这里
- Transform(HDU-5637)(bfs+异或应用):点击这里