2021-08-08

3 篇文章 0 订阅
3 篇文章 0 订阅

宽搜的概念

枚举搜索

把待搜索的空间划分成若干个区域,要求划分的区域不重复,不遗漏。

按照一定的顺序逐一搜索每个区域,直至找到目标或者整个空间搜索完毕。

前提条件

能够清楚地知道整个空间的大小。

划分的区域是能够按照一定的顺序去搜索的。

定义

  • 宽度优先搜索(Breadth First Search, BFS)又称为广度优先搜索。
  • 宽度优先搜索算法属于一种盲目搜索,目的是从起始结点出发,系统地展开状态空间中的所有结点,以找寻目标结点(目标状态)。
  • 宽度优先搜索的算法思想是:从初始结点开始,先用产生式规则生成第一层结点,检查目标结点是否在这些后继结点中;若没有,再将所有第一层的结点逐一扩展,得到第二层结点,并逐一检查第二层结点中是否包含目标结点;若没有,再逐一扩展第二层所有结点……,如此依次扩展,直到发现目标结点或者状态空间搜索完毕为止。
  • 宽度优先搜索的关键操作是状态扩展,如何来实现呢?

答案:使用队列

宽搜的实现

宽度优先搜索的基本框架

while (队列不为空) {
    读取头结点,头结点出队
    扩展新结点 {                        // 状态转移
        if (新结点可以入队) {
            如果是目标结点,就地结束    // 若没有目标结点,则不判断
            新结点入队
            标记新结点已入队
        }
    }
}
  • 状态表示:状态一般指对结点信息的描述,通常用T表示。一般用T0表示初始状态,Tn表示目标状态。
  • 状态转移:根据产生式规则和约束条件控制从当前状态转移到下一个状态。
  • 状态判重:大多数情况下,如果出现重复状态会造成死循环。这是宽度优先搜索不同于深度优先搜索的方面。

#宽搜的应用

##例题1:走迷宫

**一个迷宫由R行C列 (1<=R,C<=40) 格子组成,有的格子里有障碍物,不能走,用格子组成,有的格子里有障碍物,不能走,用#表示;有的格子是空地,可以走,用表示;有的格子是空地,可以走,用 . 表示。迷宫左上角和右下角都是 **.

给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能做到)。只能在水平方向或垂直方向走,不能斜着走。

注意:计算步数要包括起点和终点。

###输入数据

4 4
..##
#...
#.#.
#.#.

输出数据

7

###输入格式

输入第一行包含 2 个正整数 R, C

第二行开始,连续R行,每行一串由C个字符构成的字符串,只包含 ‘.’ 和 ‘#’。

输出格式

输出一个整数,表示要求的步数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值