蜗牛

一步一步往上爬

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 

 

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 }

 

posted on 2021-09-25 19:36  对影丶成三人  阅读(47)  评论(0)    收藏  举报