基础DFS总结
一、基础DFS模板
bool check(参数)
{
if(满足条件)return true ;
else return false;
}
void dfs(int step)
{
判断边界
{ 相应操作 }
尝试每一种可能
{
满足check条件
标记
继续下一步dfs(step+1)
恢复初始状态(回溯的时候要用到) }
}
典例
1,N1318 自然数拆分
2,P1219 八皇后
DFS函数内部注意事项:
1.形参!!!
DFS的形参需要具有一定的主动改变性质,在输出的时候会用与循环 |
---|
1.DFS的形参需要与递归终止条件,建立某种联系 |
2. 基本上对于任何DFS的回溯都需要使用顺序形参,方便回溯和逐位更改 |
2.函数内部
去重去重去重去重!!!!!!!!重要的事情说N遍 |
---|
1.在DFS 函数内第一步,对可能出现的结果进行枚举,在与最外层循环利用数组下标,对操作进行枚举 |
2.第二步,结合边界条件进行判断,主要用到的有桶去重理论,数组越界问题(二维) |
3. 对于通过第一层分支筛选条件的数据储存并后续利用 |
4,若变量达成某条件,值更新并进行目标操作(如输出,计数增加) |
5. 若未达成条件,可以进行增序递归(下解释!!!) |
6.回溯的过程中,需要对全局变量进行的任何改动进行复原,对于局部变量可以免除修改 (部分) |
注意:
1.所谓主动改变,是在函数内调用递归函数的过程中进行改变
2.在判断最大值或最小值的过程中,无需变量达成某终态,增序递归始终不停止
3.巧妙处理,数组越界的方法就是增加虚拟边界