BFS告一段落。
去年暑假刚接触的时候还不知道队列是什么,所以觉得好难。之后BFS好像一直被定位在一个比较水的层次上吧,在一堆高级算法之间显得不是那么重要。
所以停课前对BFS的认知还停留在那棵树上……
就是这样:
一层一层搜。
停课之后断断续续从迷宫开始,每道题都耗时很久,简单些的常常一眼切,然后因为输入以及其它各种智障错误一直跑不出来。平均速度一天一两道题吧,弱得不行。
最近做过的题:
※迷宫/地图
虽然是入门题,也是搞了很久。
第一次使用dx[]={0,1,0,-1},dy[]={1,0,-1,0}来模拟四个方向的移动。
“输出的方式贼有意思”
是啊是啊。过几天再打一遍。
当时没有想明白为什么这样找出来的路线就是最短的,后来慢慢理解它是一层一层入队,每次搜把一层所有情况都考虑到了,所以一旦到达终点就必然是最早到达。
平常做题一直没留意,做这个的时候才知道单个字符只能用单引号表示,字符串要用双引号表示。然后就是简单的最原始的宽搜~当时居然妄想把字符数组初始化@#@¥@#@#!@#%¥……%&……*
水题……弄了好久……卡在输入上……
这个题有点小坑,行数和列数反过来说……
无限心酸。
题目要求找出所有可能的终点,所以走过的点可能再走,于是不能再用简单的二维数组判重,需要再加一维表示方向数,含义是在给出的第几个方向上走到了这个点,以相同的步骤走到过当前点,则不再入队。最后统计在最后一个步骤到达的所有点,即为答案。
codevs 1902 刺杀大使(BFS+二分)
挺好的题。
codevs 1536 海战
统计地图中方块的个数,还要判断是否有两个方块接起来并且组不成一个新的方块的不合法的情况。接触的情况一共有四种,挨个判断就好,好像没什么机智的方法。
挺有意思的。成功剪枝的实例。体现了BFS的特点。
一直RE是因为开了个很小的数组。。。
以后做题应当反复检查数据范围,数组大小,反复检查!
判重判的是在当前这次的扩展中是否走到过。
死循环会导致MLE!!而且过了样例……于是放心交了……
过样例的时候勿狂喜。反复检查有没有可能导致死循的智障错误,比如判重不全面,判重的元素放错……防不胜防。
↑以上套路基本一样:
点入队,更新相关的所有点,出队,相关点入队,判重。
接下来,,,关于串
※字符串的转换
codevs 1099 字串变换
这个可以用双向BFS做。
双向BFS跑得快~可是太难调了……先学会,,然后能不用就不用吧。
双向BFS适用于已知初始状态和目标状态,然后分别作为BFS的起点,也就是从两头开始搜。又是由于每次都是搜一层,所以如果题目有解,则中间必然会相遇。有一个点一直过不了QWQ……
放进队列中的是字符串,所以是queue<>q;括号里写string
※局面
codevs 1004 四子连棋
出现了奇怪的错误。
需要用到hash判重。三进制转化为十进制。
amzing,放到队列里的居然是整个局面。包括两个空格的位置,步数,上一步走的是黑棋还是白棋甚至整个棋盘也可以存进去。强大强大。
昨天考试最后一题好像跟这个类似,试着打了一下,跑不出来QWQ。
…………
…………
…………
※乱七八糟的BFS
codevs 1506传话
算是BFS的应用吧
综上。
①:BFS一定会有判重的过程,也许一个点会重复走,也许判重不只判坐标(逃跑的拉尔夫)但必须判重;
②:要相信结构体可以存下整个世界……
③:做任何题都要检查好数据范围,数组大小;
④:关于迷宫/地图的读入;
⑤:BFS有时不是很水啊……