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用来求一些“最短性质”的问题