写这类搜索题。首先感觉要有个框架。比如我的框架对于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:

基础的BFS按照以上是能解决的。

而BFS往往会有别的条件,比如某种技能(穿墙,走两步,行和列坐标变化。。。)种种技能。同时这技能往往会弄上数值代表能使用的次数之类。

其实这些技能只是多了方向而已。多了种你能行走的方式。 当然。技能值越多往往是越好的(因为你有更多的选择,或者说因为有技能而有更快的方案,或者是不得不用技能的情况。比如前面有墙。你用穿墙术。)

那好。我们的首要任务明确了。分析什么是时间什么是技能值。其实这个很简单。只要看输出。要求什么最小即可。(两者都最小的话,我还没遇到过。)

什么最小什么就是时间除此之外,其实看看题目就能区分开来。

除此之外让我们看清楚BFS的的搜索过程。它是搜索在这个点能到达的点集的点。也就是说时间和它的关系是每一步增加一下时间。那么。技能只是在控制方向的话。我们并不需要去考虑因为技能而变得不再是简单的BFS类型。(当然那个技能不是做出什么让时间加一减一的事情。也许它可以通过穿墙使得时间变短,但这并不违反简单的BFS)那我们可以放心地只是在方向上进行改造。

NightMare:有一个数值是炸弹爆炸的数值 还有一个统计总时间。 我们要控制的量是总时间。所以这个是上述的时间。而炸弹爆炸其实应该抽象成一个技能。能够行走的技能。而亭子能够让技能恢复。

捡骨头:(学长原创题)大意就是你有一项可以走两步并且时间耗费只用1的技能(其实就是不影响时间的方向)。并且你可以借此来穿一层墙。这很明显。技能是走两步(方向拓展,我们只要在搜索的时候扩展一下方向)。

上述两类你会发现所谓技能只是让行走变得方便或者迟钝。总之就是方向上的控制(也许你会觉得前者感觉不像。但是你可以认为一开始你连走都不能走,所以爆炸了就果断continue。)。这两种都有个问题。也就是标记问题。同一个地方并不是走过就不能走的。一个很简单的例子。 你用技能走到了一个点。但是同样你可以不用技能走到这个点。前者没技能了。而后者有。 然而后续情况必须你有技能点。所以你不能用传统的标记手段了。你必须新NEW一个mark数组。然后去找最优的(也就是技能点最大的)情况。

其实除了经典的技能问题。还有别的问题也是如此。

只要抓住其根本。这些因素是影响方向的。而不是影响时间本身!就符合简单的BFS。

Rescue:有直接影响时间的因素。

你会发现。这个时候你这个点能相通的点集并不是时间最小的点。所以这并不符合简单的BFS。那么你就需要每次在放入点。拿出点的时候。要取时间最小的点。因为你可以到达的还是那样没变。然后你应该从时间最小的开始遍历。这个你就需要用到优先队列了。

优先队列的使用:

    #include <queue>
struct Node
{
int x;
int y;
int time;
friend bool operator < (const Node &a,const Node &b)
{
return a.time>b.time; // > 的是对的 也就是返回小的。
}
}now,next;
priority_queue <Persion>q;

优先队列的使用

综上两种:分析一个问题。HDU-1180.诡异的楼梯

楼梯会随着时间而变动方向。

我们先考虑不变方向的楼梯。很明确。就是第一种情况。只是影响方向而已

如果这个楼梯会变方向。并且你并不能原地暂停。这个问题始终还是第一种情况。(即使你再一个返回还是不能通过。并且根据奇偶剪枝的知识。你会发现不能通过的点始终不能通过。即使你走了再复杂的路线。)

然而这个问题上我们可以等一秒再通行。这个原地暂停。

导致了不是简单的BFS。因为简单的BFS是你这个点能相通的点集并不是时间最小的点(同时很正常的只能搜索一次),因为你的点集会发生变化。(在楼梯前的那些点)所以你必须要2次才能搜索完它通的点集。或者需要的时间更多。

并且原地暂停这个并不适合加在方向上。因为无论是时间标记还是地点标记都不允许这类情况出现。即使加上去也太损耗效率。

所以利用优化队列转化成简单的BFS。

对楼梯处的方向处理。最难的地方就是原地了。怎么做到原地?

我的思路是直接走过去。如果是不行情况的楼梯。那么时间+2.如果是可行情况的楼梯。那么时间+1.

由于优先队列能帮忙调整。所以会符合。(其实即使是简单的BFS也能把普通队列改成优先队列来做。只是会耗费时间。)

别人的思路是。楼梯也是一个可达方块。时间在上面损耗。假如是符合的。还要处理时间-1。

其实观察我们对时间的处理。就能很简单发现这是第二类情况的问题了。尽管说原地暂停这个并不是十分明显。(其实考虑一下 原地暂停就是时间+1啊。)这样就能清楚明白了。

最后:同样可以解决二种情况结合的问题。标记和优先队列并不会冲突。

   其实我是分析了在第一种情况中的一个特殊情况 也就是有技能值得情况。而普通梯子 和 空间传送器 之类的问题就是最最简单基础的BFS问题而已。   并且不用特殊标记时间,可以标记的是位置。

BFS的小结的更多相关文章

  1. 小结:bfs

    概要: 我们在初始状态要到达终止状态可以沿着同深度的向下搜索,这样范围覆盖更广,在解的深度较小的时候十分适用. 技巧及注意: 所有状态在转移后如果要打标记一定要在进队列前打!不要在出队列才打!否则就是 ...

  2. BFS小结

    其实bfs本身不难,甚至不需要去学习,只要知道它的特性就可以写出来了.往往,bfs都是用递归做的.递归比循环更容易timeout.所以这次遇到一题bfs,卡时间的就悲剧了. PAT1076 #incl ...

  3. bfs与dfs小结

    1,bfs适合状态容易存储的题目,如果状态比较难存储,就难以进行记忆化搜索,必然会难以bfs. (比如听说滑雪这个题你用bfs会死得很难看) 2,但是有些题目会很深(比如网格单源最短路),用dfs会跑 ...

  4. POJ 3414 Pots【bfs模拟倒水问题】

    链接: http://poj.org/problem?id=3414 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#probl ...

  5. PatrolRobot(UVa1600)BFS

    PatrolRobot(UVa1600)BFS 珉黻郐距 河吏蝉醉 闵棵黏言 芤她之瞌 褰上稽莨 錾傻奉 郦玫睃芩 摇摇头还没回答魏海洪就抢先回答道:呵呵你们几个别试 蚰镉氡 钬 绦可 ...

  6. 2017河工大校赛补题CGH and 赛后小结

    网页设计课上实在无聊,便开始补题,发现比赛时候僵着的东西突然相通了不少 首先,"追妹"这题,两个队友讨论半天,分好多种情况最后放弃(可是我连题目都没看啊),今天看了之后试试是不是直 ...

  7. 2018年天梯赛LV2题目汇总小结

    Ⅰ.L2-1 分而治之---邻接表 分而治之,各个击破是兵家常用的策略之一.在战争中,我们希望首先攻下敌方的部分城市,使其剩余的城市变成孤立无援,然后再分头各个击破.为此参谋部提供了若干打击方案.本题 ...

  8. 深度估计&平面检测小结

    https://yq.aliyun.com/ziliao/582885 最近一段时间已知忙着赶图像分析与理解的项目,在三个星期内强行接触了CNN,MRF,Caffe,openCV在内的很多东西.现在项 ...

  9. 第七十四课 图的遍历(BFS)

    广度优先相当于对顶点进行分层,层次遍历. 在Graph.h中添加BFS函数: #ifndef GRAPH_H #define GRAPH_H #include "Object.h" ...

随机推荐

  1. CodeForces 547D Mike and Fish 思维

    题意: 二维平面上给出\(n\)个点,然后对每个点进行染色:红色和蓝色,要求位于同一行或同一列的点中,红色点和蓝色点的个数相差不超过1 分析: 正解是求欧拉路径,在这篇博客中看到一个巧妙的思路: 对于 ...

  2. 相机imu外参标定

    1. 第一步初始化imu外参(可以从参数文档中读取,也可以计算出),VINS中处理如下: # Extrinsic parameter between IMU and Camera. estimate_ ...

  3. android 几个工具方法

    集合几个工具方法,方便以后使用. 1.获取手机 分辨率屏幕: public static void printScreenInfor(Context context){ DisplayMetrics ...

  4. Linux命令应用大词典-第26章 模块和内核管理

    26.1 lsmod:显示内核中模块的状态 26.2 get_module:查看内核模块详细信息 26.3 modinfo:显示内核模块信息

  5. lintcode514 栅栏染色

    栅栏染色 我们有一个栅栏,它有n个柱子,现在要给柱子染色,有k种颜色可以染.必须保证不存在超过2个相邻的柱子颜色相同,求有多少种染色方案. 注意事项 n和k都是非负整数 您在真实的面试中是否遇到过这个 ...

  6. vista x64 vs2010 win32添加资源 未能完成操作解决办法

    非常痛苦的感觉,不能用vc6,msdn library也不好用,去2k3系统试了下,没有任何问题,无奈想重装系统了,但是太浪费时间,装了虚拟机也是vistax64的,安装之后正常... 卸载重新安装依 ...

  7. 01背包问题:DP

    题目描述: 有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次. 第 i 件物品的体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大.输出 ...

  8. ServiceStack.Ormlit 事务

    应该使用这个方法开启事务 public static IDbTransaction OpenTransaction(this IDbConnection dbConn) { return new Or ...

  9. 【web前端开发】浏览器兼容性处理大全

    1.居中问题 div里的内容,IE默认为居中,而FF默认为左对齐,可以尝试增加代码margin: 0 auto; 2.高度问题 两上下排列或嵌套的div,上面的div设置高度(height),如果di ...

  10. Coins and Queries(map迭代器+贪心)

    题意 n个硬币,q次询问.第二行给你n个硬币的面值(保证都是2的次幂!).每次询问组成b块钱,最少需要多少个硬币? Example Input 5 42 4 8 2 4851410 Output 1- ...