ZCMU1620
来源:互联网 发布:激战2全知之眼 编辑:程序博客网 时间:2024/05/21 11:13
1620: 全排列
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 198 Solved: 89
[Submit][Status][Web Board]
Description
给定n个数 a[0] , a[1] ........ a[n-1], 输出其全排列。
Input
第一行输入一个数n,(n<7)
接下来一行输入n个数。
Output
按字典序从小到大输出全排列
Sample Input
31 2 331 2 2
Sample Output
1 2 31 3 22 1 32 3 13 1 23 2 11 2 22 1 22 2 1
HINT
全排列,枚举排列常用的方法有两种:一种是递归枚举,另一种是用STL中的next_permutation
#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>using namespace std;void print_permutation(int n,int *p,int *a,int cur){ if(cur==n) { for(int i=0;i<n-1;i++) { printf("%d ",a[i]); } printf("%d\n",a[n-1]); } else for(int i=0;i<n;i++) if(!i||p[i]!=p[i-1]) { int ok=1; int c1=0,c2=0; for(int j=0;j<cur;j++)if(a[j]==p[i]) c1++; for(int j=0;j<n;j++) if(p[i]==p[j]) c2++; if(c1<c2){ a[cur]=p[i]; print_permutation(n,p,a,cur+1); } }}int main(){ int n,p[10],a[1000]; while(~scanf("%d",&n)) { memset(a,0,sizeof(a)); for(int i=0;i<n;i++) { scanf("%d",&p[i]); } sort(p,p+n); print_permutation(n,p,a,0); } return 0;}
#include<bits/stdc++.h>using namespace std;int main(){ int n,a[10]; while(cin>>n) { for(int i=0;i<n;i++) cin>>a[i]; sort(a,a+n); do { for(int i=0;i<n-1;i++) printf("%d ",a[i]); printf("%d\n",a[n-1]); }while(next_permutation(a,a+n)); } return 0;}