题目一:全排列
Description
输入正整数n,按字典序从小到大的顺序输出1~n的所有排列。
Input
输入一个正整数n(1<=n<=20)
Sample
3
Sample Output
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
#include<stdio.h> #include<iostream> #include<string.h> #include<map> #include<algorithm> using namespace std; int A[1009]; void print_permutation(int n,int *A,int cur) { int i,j; if(n==cur) { for(i=0;i<n;i++) printf("%d ",A[i]); printf("\n"); } else { for(i=1;i<=n;i++) { int ok=1; for(j=0;j<cur;j++) { if(A[j]==i) ok=0; } if(ok) { A[cur]=i; print_permutation(n,A,cur+1); } } } } int main() { int n; while(scanf("%d",&n)==1) { print_permutation(n,A,0); } return 0; }题目二:不重复排列
Descripution
按字典序从小到大不重复的顺序输出n个数的所有排列。
Input
输入的第一行是一个正整数n(1<=n<=20),表示整数的个数。第二行有n个整数,用空格隔开。
Output
输出n个数的所有不重复序列,序列之间的数字用空格隔开,每个序列占一行。
Sample Input
3
8 -8 8
Sample Output
-8 8 8
8 -8 8
8 8 -8
#include<stdio.h> #include<iostream> #include<string.h> #include<map> #include<algorithm> using namespace std; int A[1009],P[1009]; void print_permutation(int n,int *P,int *A,int cur) { int i,j; if(n==cur) { for(i=0;i<n;i++) printf("%d ",A[i]); printf("\n"); } else { for(i=0;i<n;i++) { if(!i||P[i]!=P[i-1]) { int c1=0,c2=0; for(j=0;j<cur;j++) if(A[j]==P[i]) c1++; for(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,i; while(scanf("%d",&n)==1) { for(i=0;i<n;i++) scanf("%d",&P[i]); sort(P,P+n); print_permutation(n,P,A,0); } return 0; }