广度优先搜索算法简介

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

状态存储的优化——按位存储
如果我们要表示4头猪的状态,我们只需要使 用一个单字节变量即可,而不需要开一个4字 节的字符串。
意义在于,通过这样的手段,我们能够压缩状 态的存储空间。
4头猪的实际状态空间为3*3*3*3,如果使用4 个字节的字符串来表示4头猪,那么我们默认 的存储空间应该为256*256*256*256,而如果 用一个字节来表示,我们需要的存储空间仅为 256,已经很接近实际使用空间了☺
状态存储的优化——典型例子
POJ1753 给定一个4*4的黑白棋盘的初始状态,判
断能否通过满足一些给定的翻转规则, 使得所有棋面的颜色都一样,如果可以, 输出最小步数。
状态存储的优化——典型例子
那么,每个棋子只有两种状态,黑面朝 上,或者白面朝上;
广度优先搜索
要求用最少的步数,我们容易想到的就是广度 优先搜索;
对于第一个题,地图大小为8*8,因此我们搜 索过程中可以使用mark[8][8]这样一个数组来 标记已经搜索过的节点;
而对于第二道题,两个桶的大小都不超过100, 那么我们我们可以用一个二维数组mark [ 100 ] [ 100 ] 标记重复的状态来判重,并且保存起路 径就可以了。
k = Q[k].pre;
}
}
最后逆序打印seq即可。
1. 状态空间的优化
在确定使用广度优先之后 我们需要仔细 的估算状态的数量,和规模,如果规模 太大,超过了承受范围,我们就需要试 着去考虑缩小状态的规模。
Poj1324 Holedox Moving
贪吃蛇的游戏相信大家都玩过,这个题 也是类似的,题目要求蛇头能达点(1, 1)
因为广度优先搜索需要判重,而判重就 需要用到记录状态,但是这道题中最大 的难点就是状态的记录。
因为我们需要记录的是蛇头的位置,还 有蛇身的情况。
Poj1324 Holedox Moving
平时一般迷宫问题,我们用广度优先搜 索的时候,一般就是用一个数组去保存 状态。那这个题可以吗???
我们考虑最极端的情况,蛇的长度最大 的时候有8段,我们如果要记录这8段的 位置,位置的可能是 20 *20=400, 那么就可能会用到 (400)^ 8的 空间,这样做可能吗?或者说这样有必 要吗?
搜索算法及其在ACM中的应用
北京邮电大学ACM集训队 2009-04-04
搜索算法分类
BFS
普通BFS 优先队列BFS 双向BFS A*算法
DFS
普通DFS 迭代加深算法 IDA*
搜索的剪枝和优化
一. BFS——广度优先搜索
最重要的四点
状态空间是什么 状态如何存储 状态如何判重 怎么搜索
op表示此次搜索的方向,而pre表示到达此状态的前一 个状态在队列中的位置,初试状态的pre为-1。
小技巧——保存路径的方法
则我们获取路径的方法为(记录在数组seq中):
void output(int k){
sn = 0;
while(Q[k].pre != -1){
seq[sn++] = Q[k].op;
Poj1324 Holedox Moving
条件n, m (1<=n, m<=20) 和 L (2<=L<=8)
n, m 为地图的行数和列数,L为蛇的长度 同时地图上还有一些阻碍物。 蛇头不能碰到自己的身体,并且不能碰
到阻碍物。
Poj1324 Holedox Moving
最好的算法,就是搜索,要求出最小的 步数,并且可能有无解的情况,那么当 然用广度优先搜索算法。
注意到格子地图的大小为8*8
POJ3414
给两个桶,两个桶的体积分别为A和B, 要求用这个两个桶装出C体积的水,如果 可以的话就输出装法,不可以的话就输 出impossibie.
我们发现A,B的最大值都不会超过100, 并且是要求输出最少的步数和方法。
共同点
找到最少步数 搜索范围的限制
状态存储的优化——按位存储
对于那些包含多个对象的状态,并不是 都需要用多个int型整数或者字符串来表 示;
比如一头猪,每天的生活就是吃,睡, 还有Nature Calling,因此我们可以简单 地认为一头猪每天只有3种状态,我们可 以用一个字节来表示一头猪,当然,更 简单的,两个比特位就足以表示一头猪。
小技巧——方向数组
广搜的时候,一般使用方向数组来辅助 坐标的修改,例如:
const int dx[] = {-2, -2, -1, -1, 1, 1, 2, 2};
const int dy[] = {-1, 1, -2, 2, -2, 2, -1, 1};
小技巧——保存路径的方法
一般用一个结构体来记录广搜时的状态,如下所示: struct state{ int x, y; int d, op; int pre; }; 如果需要记录路径,我们在结构体中加入两个变量,
Poj1324 Holedox Moving
分析下去,我们会发现,如果蛇头的位 置确定,那么蛇身可以从蛇头按4个方 向一直走到蛇尾
Poj1324 Holedox Moving
这样状态数只为 20 * 20 * (4)^7 =6553600
一个的数组还是可以承受的。
2.ຫໍສະໝຸດ Baidu状态存储的优化
有些问题的状态规模很小,处理起来很 简单,但有些问题的状态比较复杂,储 存起来比较困难,这个时候我们就要考 虑一下如何表示一个状态 。
mark[curState] = true;
extState = extend ( curState );
If( !mark[extState] ) {
Q.push( extState );
}
}
POJ2243
给定一个8*8的格子地图,再给定初始点 和终止点,要求输出从初始点到达终止 点的最少步数。
状态空间的优化 状态存储的优化 状态判重的优化 搜索方式的优化
BFS
广度优先搜索的思想很简单。
queue Q;
Q.push( startState );
While ( ! Q.empty ) {
curState = Q.front();
if( curState == endState ) return true;
相关文档
最新文档