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
-
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 int s[12]={1,2,3,4,5,6,7,8,9}; 6 int main() 7 { 8 int T; 9 scanf("%d",&T); 10 while(T--) 11 { 12 int i,n; 13 scanf("%d",&n); 14 do 15 { 16 for(i=0;i<n;i++) 17 printf("%d",s[i]); 18 printf(" "); 19 }while(next_permutation(s,s+n)); 20 } 21 return 0; 22 }
1 #include <stdio.h> 2 #include <string.h> 3 int res[12]; //存放结果 4 int vis[12]; //标记是否被用过 5 int n; 6 void output() 7 { 8 int i; 9 for(i=1;i<=n;i++) 10 printf("%d",res[i]); 11 printf(" "); 12 } 13 void dfs(int step) 14 { 15 int i; 16 if(step>n) //满足深度时输出 17 output(); 18 else 19 { 20 for(i=1;i<=n;i++) 21 if(!vis[i]) //如果i没有被用过 22 { 23 vis[i]=1; //用过后标记为用过 24 res[step]=i; //存入数组,待会儿输出 25 dfs(step+1); //继续找下一位数 26 vis[i]=0;//函数返回后就以为着回到上一次的for循环,那么这次的i定将被释放(不用),那么标记为没用过 27 } 28 } 29 } 30 int main() 31 { 32 int T; 33 scanf("%d",&T); 34 while(T--) 35 { 36 memset(vis,0,sizeof(vis)); 37 scanf("%d",&n); 38 dfs(1); 39 } 40 return 0; 41 }