赞
踩
用到的dfs的情况多为求某些情况的全排列的情况,其多用递归来实现。故dfs基本就是递归的思想;
基本的伪代码板子如下所示
- #include<iostream>
- using namespace std;
-
- //定义输出数组和标级数组
- void dfs(){
- if()//截止条件
- {
- //输出
- return ;
- }
- for(int i = 1;i<=n;++i)
- {
- if()//判断条件
- {
- //将标级数组置为1
- dfs(u+1,n);
- //与上面对称,将标级数组置为0 。还原现场
- }
- }
- }
-
- int main (){
- int n;cin>>n;
- dfs(1,n);
- return 0;
- }
下面附上图进行举例说明
上图中蓝色箭头表示for循环对兄弟结点进行访问。红箭头表示使用dfs(u+1,n)的递归和回溯的过程。黄箭头表示递归过程中不满足条件的。最后在u==n+1时将结果进行输出。
注意的是,在上述代码中,回溯后需要还原现场。也就是上面的对称的过程。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。