南阳366--D的小L(Dfs)

D的小L

时间限制:4000 ms  |  内存限制:65535 KB
难度:2
 
描述
      一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给匡匡出了个题目想难倒匡匡(小L很D吧),有一个数n(0<n<10),写出1到n的全排列,这时匡匡有点囧了,,,聪明的你能帮匡匡解围吗?
 
输入
第一行输入一个数N(0<N<10),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个整数x(0<x<10)
输出
按特定顺序输出所有组合。
特定顺序:每一个组合中的值从小到大排列,组合之间按字典序排列。
样例输入
2
2
3
样例输出
12
21
123
132
213
231
312
321
来源
原创
上传者
kapop
RE: 就是组合数那一类题。
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 using namespace std;
 5 int n, dis[10], vis[10];
 6 void Dfs(int a)
 7 {
 8     if(a == n)
 9     {
10         for(int i = 0; i < n; i++)
11             printf("%d", dis[i]);
12         printf("
");
13         return;
14     }
15     else
16     {
17         for(int i = 1; i <= n; i++)
18         {
19             if(vis[i])
20                 continue;
21             vis[i] = 1;
22             dis[a] = i; 
23             Dfs(a + 1);
24             vis[i] = 0;
25         }
26     }
27 }
28 int main()
29 {
30     int t;
31     scanf("%d", &t);
32     while(t--) 
33     {
34         scanf("%d", &n);
35         memset(vis, 0, sizeof(vis));
36         Dfs(0);
37     }
38     return 0;
39 } 
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6 int main()
 7 {
 8     int t;
 9     scanf("%d", &t);
10     while(t--)
11     {
12         int n, list[10];
13         scanf("%d", &n);
14         for(int i = 0; i < n; i++)
15             list[i]  = i + 1;
16         int pre = -1;
17         do{
18             if(list[n-1] != pre)
19             {
20                 for(int i = 0; i < n; i++)
21                     printf("%d", list[i]);
22                 printf("
");
23                 pre = list[n-1];
24             }
25         }while(next_permutation(list, list + n));
26     }
27     return 0;
28 }
STL--next_permutation(a, a+n)(我nm, 函数名容易记错有木有。)
原文地址:https://www.cnblogs.com/soTired/p/4726106.html