码迷,mamicode.com
首页 > 其他好文 > 详细

DFS

时间:2020-07-28 16:53:09      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:oid   mamicode   图片   ++   code   inf   开始   pause   nbsp   

全排列问题
给定一个整数n,将数字1~n排成一排,将会有很多种排列方法。

 

现在,请你按照字典序将所有的排列方法输出。

 

输入格式
共一行,包含一个整数n。

 

输出格式
按字典序输出所有排列方案,每个方案占一行。

 

数据范围
1≤n≤7
输入样例:
3
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
 
思路:DFS 把所有情况结合起来我们可以将其看作一棵树。
例如题给样例:1 2 3 求其全排列,我们画出这棵树
技术图片
 
其中我们需要对一些重复的情况则停止搜索,这就是剪枝,例如最左边1 2 _ 之后会有1 2 3或者1 2 1或者1 2 2 几种情况 而后边两种因为我们设置一个状态数组表示已搜,则如果显示已搜则直接停止本次搜索,直到搜索的数字个数到达n个 则输出。
 
代码:
 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 const int N = 10;
 6 int path[N], n;
 7 bool state[N];
 8 
 9 void dfs(int x)
10 {
11     if(x == n)
12     {
13         for(int i = 0; i < n; i++) printf("%d ", path[i]);
14         puts("");
15         return;
16     }
17 
18     for(int i = 1; i <= n; i++)
19     {
20         if(!state[i])
21         {
22             path[x] = i;
23             state[i] = true;
24             dfs(x+1);
25             state[i] = false;
26         }
27     }
28 }
29 
30 int main()
31 {
32     cin >> n;
33 
34     dfs(0);
35 
36     system("pause");
37     return 0;
38 }

 

 n皇后问题:
 
思路:有按行搜与按个搜两种,后者效率有点低,就不说了。
按行搜就是每到一行 枚举行的每一个位置 然后看起列 正斜 反斜 是否已经有皇后 若有则搜索下一个位置 若没有则宣布占领 同时标记其列 正斜 反斜被占领。
直到n个皇后全部放好位置之后就开始输出即可。
 
其中正斜  假设当前点的坐标为(x,y),则其正斜就是x + y。
反斜 假设当前点的坐标为(x,y),则其反斜就是n - x + y 或者 x - y + n,有个n主要是为了防止出现负数的情况
 
代码:
 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 const int N = 20;
 6 char g[N][N];
 7 bool dg[N], udg[N], col[N]; //dg表示正斜边 udg表示反斜边
 8 int n;
 9 
10 void dfs(int x)
11 {
12     if(x == n)
13     {
14         for(int i = 0; i < n; i++) puts(g[i]);
15         puts("");
16         return;
17     }
18 
19     for(int i = 0; i < n; i++)
20     {
21         if(!col[i] && !dg[x+i] && !udg[n-x+i])
22         {
23             col[i] = dg[x+i] = udg[n-x+i] = true;
24             g[x][i] = Q;
25             dfs(x+1);
26             g[x][i] = .;
27             col[i] = dg[x+i] = udg[n-x+i] = false;
28         }
29     }
30 }
31 
32 int main()
33 {
34     cin >> n;
35     for(int i = 0; i < n; i++)
36     {
37         for(int j = 0; j < n; j++)
38         {
39             g[i][j] = .;
40         }
41     }
42 
43     dfs(0);
44 
45     system("pause");
46     return 0;
47 }

 

DFS

标签:oid   mamicode   图片   ++   code   inf   开始   pause   nbsp   

原文地址:https://www.cnblogs.com/ZhengLijie/p/13391481.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!