DFS+回溯
介绍
回溯就是对一个问题的所有可能结果进行搜索的一种方法,通过深度优先遍历的思想来实现。本质上回溯算法就是一种遍历算法,它会搜索得到一个问题的所有解,时间复杂度很高。
对于所有可能的情况,我们一种一种的去尝试(一般按照顺序来枚举,这样保证每一个情况都能搜索到)如果是我们想要的结果就放到结果集中。另外,在满足某些条件的时候可以进行剪枝。一般都是将这种问题转换成一个树形结构来进行分析。既然是树形结构,就要知道
1.每个节点中是什么:可以根据节点中的值来判断是否要加index,来表示下一次从哪里开始遍历
2.每条路径上是什么:使用了什么
3.如何产生树的分支:满足什么条件的时候可以直接剪枝,一些搜索可以直接排除,就不用画这个分支了,一般重复问题要考虑下。
4.树结构有几层:到什么时候搜索截止,dfs中的i如何变化,是i+n,还是i保持不变
5.遍历这个节点之后是继续还是回退:回溯,这个点遍历结束要回到上一个分叉点,那状态就要重置,需要设定为和上一次一样。
6.记录该节点是否访问过:visit记录下这个节点后面还需要用到吗。
做题的时候:
对于树形图,思考清楚:题目需要的解是在叶子节点、非叶子节点还是根节点到叶子节点的路径。
模板:
void dfs(...)