回顾了一下dfs和bfs本别都是什么
详细讲解了一下dfs的运作方法
其中最终要的就是dfs的三部曲 其实跟回溯的很像
1. 确认递归函数,参数
void dfs(参数)
通常我们递归的时候,我们递归搜索需要了解哪些参数,其实也可以在写递归函数的时候,发现需要什么参数,再去补充就可以。
一般情况,深搜需要 二维数组数组结构保存所有路径,需要一维数组保存单一路径,这种保存结果的数组,我们可以定义一个全局变量,避免让我们的函数参数过多。
vector<vector<int>> result; // 保存符合条件的所有路径
vector<int> path; // 起点到终点的路径
void dfs (图,目前搜索的节点)
2. 确认终止条件
3.处理目前搜索节点出发的路径
一般这里就是一个for循环的操作,去遍历 目前搜索节点 所能到的所有节点。
用一道题去简单实现了一下dfs的流程代码,看是如何记录路径的
其中包括了一些点
1.终止条件是当我访问的点为终点后 结束并return
2.再去进行访问的时候 会有一个graph[x][i] == 1这么一个值 这是再存x和i之间是否有相连
如果有相连那么 就会把这个i放入的路径当中
再之后再看i到终点的路径 也就是下一个dfs 完成并返回后 要进行回溯 保证能够访问上层节点的一下一个节点
3.在初始化的时候 会根据链接情况先把matrix进行标识
4.在结果打印时,分开打印来避免最后的空格
了解了bfs
相比起dfs,bfs是从一个点向外一层一层的去遍历
通常dfs回去解决两个点之间的最短路径问题。
因为广搜是从起点出发,以起始点为中心一圈一圈进行搜索,一旦遇到终点,记录之前走过的节点就是一条最短路径
以队列为例子
首先再定义一个队列 然后放入起始节点
并且进行标记显示为已访问过了
接下来通过不断地获取队列的元素去看当前这个元素再各个方向上的下一个节点是什么
如果说超出了map就结束 如果到了一个没有被访问到的节点 就把这个节点放进队列中
并标记已访问 在这个情况下当while loop结束也就是队列中没有元素时 这就代表所有的元素都已经访问到了