深搜-----1~n的全排列

Posted xrisa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深搜-----1~n的全排列相关的知识,希望对你有一定的参考价值。

时隔“多年”,再来解决这个历史遗留的问题----深搜

题目描述

输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入格式

一个整数 n

输出格式

由 1 ~ n 组成的所有不重复的数字序列,两数间空一格,每行一个序列。

总方案数

输入输出样例

输入 #1

3

输出 #1

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
6

思路很简单,深搜嘛,直接(拿样例来举例:)看代码吧!

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #define maxn 10005
 7 //#define ISA_XR
 8 using namespace std;
 9 int n,book[maxn],a[maxn],s;     //n-求1~n的全排列  a记录当前序列 book[i]记录 i 是否在序列中  s总排列方式个数   
10 void dfs(int step);        // step为当前在序列中的位置,即已放个数 + 1 
11 int main()
12 {
13     #ifdef ISA_XR
14         freopen(".in","r",stdin);
15         freopen(".out","w",stdout);
16     #endif
17     
18     scanf("%d",&n);
19     dfs(1);  //深搜 
20     printf("%d",s);  // 共有 n!种排列方式 
21     
22     #ifdef ISA_XR
23         fclose(stdin);
24         fclose(stdout);
25     #endif
26     
27     return 0;
28 }
29 
30 void dfs(int step)    
31 {
32     if(step == n + 1)        //所有数已放完,即已形成 1 种排列 
33     {
34         for(int i = 1;i <= n;i++)
35         {
36             printf("%d ",a[i]);        // 输出其中一种排列 
37         } 
38         printf("
");
39         s++;                        //排列种数 + 1 
40         return;                        //回到上一次尝试 
41     } 
42     for(int i = 1;i <= n;i++)
43     {
44         if(book[i] == 0)         // 这个数没放在序列中 
45         {
46             a[step] = i,book[i] = 1;    //尝试一个数将其放入序列中,已用标记book为 1 
47             dfs(step + 1);    // 下一层“下一个盒子 ”(注意 x++ 与 x + 1 与 ++x 的加一先后顺序 )
48             book[i] = 0;    // 刚尝试过的数要放回 
49         }
50     }
51     return;        //回溯(回到上一次尝试) 
52 }

 好像把思路打出来更容易理解,但我太懒了,下次想起来了在打吧。。。。咕咕咕咕

以上是关于深搜-----1~n的全排列的主要内容,如果未能解决你的问题,请参考以下文章

求n个数的全排列,n不定。用c语言。用于银行家算法中求安全序列

ACWing842. 排列数字(深搜模板题)

n阶行列式的全排列求解(Java)

回溯算法求关于排列有关问题

算法---数的全排列(深度优先搜索)

C++代码 递归算法 n个数的全排列 (是任意的,可不连续) 要求: 提示输入数的个数n 然后提示输入这n个