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
1 /* 功能Function Description: NYOJ-366 全排列问题 2 开发环境Environment: DEV C++ 4.9.9.1 3 技术特点Technique: 4 版本Version: 5 作者Author: 可笑痴狂 6 日期Date: 20120802 7 备注Notes: 8 */ 9 10 11 //代码一:---STL 12 #include<iostream> 13 #include<algorithm> 14 using namespace std; 15 16 int main() 17 { 18 int T,i,n; 19 int a[9]={1,2,3,4,5,6,7,8,9}; 20 cin>>T; 21 while(T--) 22 { 23 cin>>n; 24 // sort(a,a+n); 每次开始之前不用重新排列,因为生成所有全排列之后虽然跳出了do循环但是数组又回到了初始的升序状态 25 do 26 { 27 for(i=0;i<n;++i) 28 cout<<a[i]; 29 cout<<endl; 30 }while(next_permutation(a,a+n)); 31 /* 32 for(i=0;i<9;++i) 33 cout<<a[i]; //测试跳出循环后输出1 2 3 4 5 6 7 8 9 即又回到了初始升序的状态 34 */ 35 } 36 return 0; 37 } 38 39 40 41 42 //代码二:----递归+回溯 43 #include<iostream> 44 #include<cstring> 45 using namespace std; 46 47 bool visit[10]; 48 int n,a[10]; 49 50 void fun(int k) 51 { 52 int i; 53 if(k==n) 54 { 55 for(i=0;i<n;++i) 56 cout<<a[i]; 57 cout<<endl; 58 } 59 else 60 { 61 for(i=1;i<=n;++i) 62 if(!visit[i]) 63 { 64 a[k]=i; 65 visit[i]=true; 66 fun(k+1); 67 visit[i]=false; 68 } 69 } 70 } 71 72 int main() 73 { 74 int T; 75 cin>>T; 76 while(T--) 77 { 78 memset(visit,false,sizeof(visit)); 79 cin>>n; 80 fun(0); 81 } 82 return 0; 83 }