首页 > 代码库 > BFS的小结
BFS的小结
写这类搜索题。首先感觉要有个框架。比如我的框架对于BFS来说(对于DFS,我想有两个一个是递归版一个是栈版)。这里是BFS小结。所以介绍一下BFS。我的框架。(也是搜集了网上许多神人的作品。)
1:节点的定义。时间问题。步数。以及一系列其他基本动态属性都放在这里。先定义2个node now和next。
2:map map本身就可以简单地记录可以行走和不可以行走的单纯点。(因为有些还有条件点。)map一开始在外面围一圈不可行走的属性。(这个也是仿照某位大神)这个围一圈直接在初始化的时候全部都是非法的 然后在scanf的时候保留即可。方便快捷。
3:mark 这个标记数组可有可无。假如map不够用的时候加入。记得初始化!
4:dir 我觉得dir真的是很重要。很多不同的走法其实都可以放入在dir之中。根据不同的情况有不同的方向的走法。
5:flag,now的初始化。
框架成熟之后是注意点(搜索的题目往往代码量较大。所以这一点是很重要的):
1:队列清空问题!(有可能上一个测试例中会有残留)
2:终点和可行走点(我喜欢在now的时候判断。即。即使遇到终点也加入队列中取出来的时候统一判断)。
终点和可行走点都是可以加入的,所以我们总是放在一起。一个判断。但是当标记为不可行走的时候。终点假设是X。也被标记成了不可行走(用map标记的时候)。
所以永远都是No!所以在里面还要特判一下加入。比如以下.是可行走。X是终点。
if(map[next.x][next.y]==‘.‘||map[next.x][next.y]==‘X‘) { que.push(next); if(map[next.x][next.y]==‘.‘){map[next.x][next.y] =‘W‘;} }
3:next的赋值。请确保每一项都确定过!。
。。。(我还是新手待填充)
一系列不同问题:
1:相同区域个数。(DFS)
2:目标查找。(DFS)
3:规定时间内目标查找。(BFS)
4:查找最近目标(BFS,Rescue,这个正确的解法是目标来查找起点。也就是说我们要有个思维。目标和起点是能互换的。另外。HDU的数据很弱。这个好题啊。这个题目值得讲讲。毒药血药问题。)
。。。(我还是新手待填充)
扩展的BFS问题:
毒药血药问题:有一个点是一个陷阱。又或者是休息亭可以提高你的血量又或者降低你的血量(时间量)。比如Rescue.
BFS的小结