搜索 —— 广度优先搜索(BFS)

【概述】

广度优先搜索从初始状态 S 开始,利用给定的规则,生成当前状态所有可能的状态,构成的下一层节点,检查是否出现目标状态G,若未出现,就对该层所有状态节点,分别顺序利用规则再次生成再下一层的所有状态节点,对这一层的所有状态节点检查是否出现 G,若未出现,继续按上面思想生成再下一层的所有状态节点,这样一层一层往下展开,直到出现目标状态为止。

 广度优先搜索可以采用循环队列或动态链表来处理,其适用于逐层寻找答案。

    

【具体过程】

    广度优先即是要按层数一层一层来遍历,先将一层全部扩展,然后再进行下一层。

    过程:

  1.  每次取出队列首元素(初始状态),进行拓展。
  2. 把拓展所得到的可行状态都放到队列里面。
  3. 将初始状态删除。
  4. 一直进行以上三步直到队列为空。

对应队列情况:

    

每个方块表示一个状态,浅蓝色的表示遍历了该状态

对应的队列的情况

【搜索框架】

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);//队列为空
}

【例题】

  1. 抓住那头牛(信息学奥赛一本通-T1253):点击这里
  2. 同题:Catch That Cow(POJ-3278):点击这里
  3. Knight Moves(HDU-1372):点击这里
    同题:Knight Moves(信息学奥赛一本通-T1257):点击这里
  4. 细胞(信息学奥赛一本通-T1329):点击这里
  5. 流感传染(信息学奥赛一本通-T1191):点击这里
  6. 最少步数(信息学奥赛一本通-T1330):点击这里
  7. 马的遍历(洛谷-P1443):点击这里
  8. A strange lift(HDU-1548):点击这里
  9. Find The Multiple(POJ-1426):点击这里
  10. Vova and Train(CF-1066A):点击这里
  11. 山峰和山谷(信息学奥赛一本通-T1454):点击这里
  12. Transform(HDU-5637)(bfs+异或应用)点击这里
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值