宽搜的概念
枚举搜索
把待搜索的空间划分成若干个区域,要求划分的区域不重复,不遗漏。
按照一定的顺序逐一搜索每个区域,直至找到目标或者整个空间搜索完毕。
前提条件
能够清楚地知道整个空间的大小。
划分的区域是能够按照一定的顺序去搜索的。
定义
- 宽度优先搜索(Breadth First Search, BFS)又称为广度优先搜索。
- 宽度优先搜索算法属于一种盲目搜索,目的是从起始结点出发,系统地展开状态空间中的所有结点,以找寻目标结点(目标状态)。
- 宽度优先搜索的算法思想是:从初始结点开始,先用产生式规则生成第一层结点,检查目标结点是否在这些后继结点中;若没有,再将所有第一层的结点逐一扩展,得到第二层结点,并逐一检查第二层结点中是否包含目标结点;若没有,再逐一扩展第二层所有结点……,如此依次扩展,直到发现目标结点或者状态空间搜索完毕为止。
- 宽度优先搜索的关键操作是状态扩展,如何来实现呢?
答案:使用队列
宽搜的实现
宽度优先搜索的基本框架
while (队列不为空) {
读取头结点,头结点出队
扩展新结点 { // 状态转移
if (新结点可以入队) {
如果是目标结点,就地结束 // 若没有目标结点,则不判断
新结点入队
标记新结点已入队
}
}
}
- 状态表示:状态一般指对结点信息的描述,通常用T表示。一般用T0表示初始状态,Tn表示目标状态。
- 状态转移:根据产生式规则和约束条件控制从当前状态转移到下一个状态。
- 状态判重:大多数情况下,如果出现重复状态会造成死循环。这是宽度优先搜索不同于深度优先搜索的方面。
#宽搜的应用
##例题1:走迷宫
**一个迷宫由R行C列 (1<=R,C<=40) 格子组成,有的格子里有障碍物,不能走,用格子组成,有的格子里有障碍物,不能走,用#表示;有的格子是空地,可以走,用表示;有的格子是空地,可以走,用 . 表示。迷宫左上角和右下角都是 **.
给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能做到)。只能在水平方向或垂直方向走,不能斜着走。
注意:计算步数要包括起点和终点。
###输入数据
4 4
..##
#...
#.#.
#.#.
输出数据
7
###输入格式
输入第一行包含 2 个正整数 R, C
第二行开始,连续R行,每行一串由C个字符构成的字符串,只包含 ‘.’ 和 ‘#’。
输出格式
输出一个整数,表示要求的步数。