ZCMU1620

来源:互联网 发布:激战2全知之眼 编辑:程序博客网 时间:2024/05/21 11:13

1620: 全排列

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 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;}