一、搜索究竟是个啥?
在没学搜索之前,我们大部分人都是这样的:
这样的:
或者是,这样的:
然而学了搜索之后,立马就感觉自己行了!
理由就是:
搜索这个东西理解起来并不难,但是代码量十分の大,十分容易令人产生成就感(线段树:???)。
如果你是一个刚学完排序的萌新,那么下面你大概率就会遇见这俩玩意儿:深搜、宽搜(dfs、bfs)。
2、宽搜(bfs,又名广搜)
宽搜顾名思义,就是追求一个“宽”,也可以说是拓展。
如果讲的难一点,宽搜就是拓展出与自己有关联的其他情况。
如果讲的通俗易懂一点,那就讲个故事吧:
红豆包子被困在了一个荒岛上,这个岛上被分割成了若干个小方格,红豆包子想要逃离这个荒岛,于是他便派出了一些红豆去打探情报。
他一开始在荒岛中的蓝色格子, 而他派出了红豆会往上下左右四个方向去打探消息,所以红豆们会到达所有红色格子。
而对于每个红色格子,红豆又会对它进行上下左右四个方向的拓展,于是便到达了所有的绿色格子。
就这样下去,黄色、黑色、紫色……
这样就成功遍历了一遍这个岛屿(岛屿礼貌:你吗?)。
在《红豆包子逃离荒岛》中,与自己有关联的情况指的是,下一步能直接达到的格子。
但是你以为宽搜就这?只能用于矩阵(逃离荒岛)中?
再讲一个故事:
红豆包子是一个十分帅气的人,但是平时脾气不大好,导致产生了很多前任(雾),现在他想向他的前任借钱。如果借不到,前任便也会向他(她)的前任借钱,就这样子无休无止……
而在他的前任中,大部分人也跟他一样,颜值高而脾气差,于是也产生了很多前任……
在上图中,红色表示红豆包子,蓝色、黄色、天蓝色代表了他的3个前任。对于黄色而言,橙色、粉色、紫色代表了她的3个前任。
这次,红豆包子又分别派出了一些红豆去借钱。这些红豆会先到达跟他关系最近的人(蓝色、黄色、天蓝色)借钱,然后会去到距离这些前任关系最近的人中去借钱……
上图表示了借钱的顺序,由此把所有的前任都遍历了一遍(礼貌前任:你吗?)。
在《红豆包子之前任历险记》中, 与自己有关联的情况指的是,自己的前任。
由此可见,宽搜并不是一种专门用于矩阵的算法。
而是一种搜索的思想。
总结出俩字:拓展。
另外要注意的一点就是:要加一个bool数组,表示有没有被访问过。
如果被访问过了,就不能够再访问了(这不是废话么)。
反之,就将它设置为访问过。
如果不这样做的话……
红豆们就会不停地在两个格子之间反复横跳,最后一脸懵逼地禀告红豆包子:
大人,程序跑爆掉了!我们被困住了!
红豆包子会向自己的前任借钱 ,前任没有钱,便会向红豆包子借钱(?),红豆包子也没钱,就会向前任借钱。
然后就这样子,程序跑爆掉了,红豆包子与前任也修成正果了……
所以不要忘记加访问数组哦!