dfs基于递归思想,步骤分为1.递归下去2.回溯上来
下面是dfs大致模板
void dfs()//参数表示状态 { if(终点状态){ return ; } if(越界或非合法状态)//剪枝 return ; for(扩展方式){ if(扩展状态合法){ //根据题目添加 标记 dfs(); 修改(剪枝) 回溯 } } }
1.数字型
[排列数字]用dfs解决全排列问题
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 const int N = 10; 6 7 int n,; 8 int path[N]; 9 10 bool st[N]; 11 12 void dfs( int u ) 13 { 14 if(u==n){//空位填完,输出结果 15 for( int i = 0; i < n; i++ ) printf("%d ",path[i]); 16 puts(""); 17 18 return; 19 } 20 for( int i = 1; i <= n; i++ ){//空位上可以选择的数字 21 if(!st[i]){//i没有被选择过 22 path[u] = i;//放入空位 23 st[i] = true;//修改状态 24 dfs(u+1);//填下一位 25 st[i] = false;//恢复现场 26 } 27 } 28 } 29 30 int main() 31 { 32 scanf("%d",&n); 33 dfs(0); 34 35 return 0; 36 }
2.地图型
[n-皇后问题]dfs按行枚举
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 const int N = 20; 6 7 int n; 8 9 char g[N][N]; 10 11 bool col[N], dg[N], udg[N]; 12 13 void dfs(int u) 14 { 15 if(u==n){ 16 for( int i = 0; i < n; i++ ) 17 puts(g[i]); 18 puts(""); 19 20 return ; 21 } 22 for( int i = 0; i < n; i++ ){//按行枚举 23 if(!col[i]&&!dg[u+i]&&!udg[i-u+n]){//u+i, i-u+n为对角线反对角线截距,+n保证结果为正值 24 g[u][i] = 'Q'; 25 col[i] = dg[u+i] = udg[i-u+n] = true; 26 dfs(u+1); 27 col[i] = dg[u+i] = udg[i-u+n] = false; 28 g[u][i] = '.'; 29 } 30 } 31 } 32 33 int main() 34 { 35 cin>>n; 36 for( int i = 0; i < n; i++ ) 37 for( int j = 0; j < n; j++ ) 38 g[i][j] = '.'; 39 dfs(0); 40 41 return 0; 42 }
本文来自博客园,作者:对影丶成三人,转载请注明原文链接:https://www.cnblogs.com/IntroductionToAlgorithms/p/15335253.html
浙公网安备 33010602011771号