算法刷题应用知识补充--搜索与图

这里写目录标题

DFS



知识点1:本题在dfs的for循环搜索中,进行了剪枝,即写一个判断函数,把不符合题意的情况直接continue,进行下一个数据的搜索

知识点2:在剪枝时,判断边界:直接对x,y在有效范围进行了判断,这样可以不必设置边界为-1

知识点3:剪枝中,会用到已经放置的位置,所以本题需要地图,定义g数组

知识点4:dfs时,虽然每次dfs可以将整个地图覆盖了,但是仍然需要回溯g的值,本质原因是因为要用g的值(是1还是0)来进行剪枝,所以g的值相当重要,需要回溯(tip:无论是否需要,都将值进行回溯就可以了,他主要的作用过程是,深搜搜到底之后,向上返回层数时,每个位置都被回溯成回溯的值)如下图:

而不回溯则是:

回溯时不管他的值是多少,等待下一次dfs直接覆盖掉

显然,我们直接统一进行回溯即可

知识点5:因为起点不确定,所以还要对起点进行手动遍历设置到地图上,但是这样的话,就相当于已经完成了一层,传入层数时传入1,进行第二层的搜索即可

dfs出来之后,也要将起点恢复成0,因为g是全局数组,不恢复会影响下一次起点的程序

dfs可以用来解决全排列、n皇后等问题,也就是一些"有多组解",但是每一组都需要搜索才能解出来等问题

dfs的回溯问题:统一将bool数据以及原数据回溯即可

dfs剪枝:可以定义一个check函数,在for遍历下一层数据时,如果不符合题意,直接continue

dfs记忆化搜索:定义一个全局数组,在if(u == n)里,也就是在递归结束的语句中,判断是否在记忆数组出现过,如果出现过,那么无需再次进行后续计算

BFS



知识点1:q数组,他的大小就是数据的多少,上题数据最多N*N个,其次,他是整个bfs的队列,作用就是按照层级搜索顺序存储搜索过的数据,这里可以知道,二维情况下,存的是搜索过的坐标,那么直接定义为PI类型的数组即可(假如元素时,元素表示为{a,b})

知识点2:要注意到题目能搜索的方向,然后对应到dx和dy向量里

知识点3:若题目要求搜索不到就输出某某某,那么可以将d数组(也就是表示第几层被搜索到的数组)全部初始化为某某某,这样如果搜不到,那么他的值就不会变,这样的话,输出d的那个位置,就是那个值

知识点4:在进行向量探索时,要定义新的x1,y1,不能对原数据x y修改,因为他们还要用于下一次的向量搜索

知识点5:每次拿到一个新的x1,y1,要对其合法性进行判断,且要判断是否d为-1,也就是没有被搜索过,不然可能会搜索到之前被搜过的

知识点6:bfs的while中,主要是构造出d数组,最后也是要取出d数组的值,但是附带每个循环步要对q数组进行相应的设置

bfs用来求一些"最短性质"的问题

一级目录

二级目录

二级目录

二级目录

一级目录

二级目录

二级目录

二级目录

一级目录

二级目录

二级目录

二级目录

相关推荐
1白天的黑夜11 分钟前
动态规划-62.不同路径-力扣(LeetCode)
c++·算法·leetcode·动态规划
少了一只鹅12 分钟前
深入理解指针(3)
c语言·数据结构·算法
仙人掌_lz15 分钟前
从零开始理解FlashAttention:算法细节图解
人工智能·python·深度学习·算法·ai·flashattention
有一个好名字35 分钟前
力扣:轮转数组
数据结构·算法·leetcode
北海有初拥42 分钟前
【day04】Fibonacci数列 | 单词搜索 | 杨辉三角
算法
David Bates1 小时前
代码随想录第40天:图论1
python·算法·图论
赵和范1 小时前
C++:求分数序列和
开发语言·c++·算法
bbblys2 小时前
B4172 学习计划 题解
算法·动态规划
菜鸟破茧计划2 小时前
线段树:数据结构中的超级英雄
数据结构·c++·算法
秦少游在淮海2 小时前
leetcode - 双指针问题
算法·leetcode