不重复排列

输入n个数值,输出由这n个数构成的排列,不允许出现重复的项

输入

3

1 1 2

输出

1 1 2

1 2 1

2 1 1

代码

#include<cstdio>

#include<cstring>

using namespace std;

const int maxn = 100;

int rcd[maxn],num[maxn],vis[maxn];

int n,m;

int read_input()

{

    if(scanf("%d",&n)==EOF)

        return 0;

    m=0;

    memset(vis,0,sizeof(vis));

    int i,j;

    for( i=0;i<n;i++){

        int val;

        scanf("%d",&val);

        for( j=0;j<m;j++)

            if(num[j]==val){

                vis[j]++;

                break;

            }

        if(j==m){

            num[j]=val;

            vis[m++]++;

        }



    }

    return 1;

}

void unrepeat(int l){



    if(l==n){

        for(int i=0;i<n;i++){

            printf("%d",rcd[i]);

            if(i<n-1)

                printf(" ");

        }

        printf("\n");

        return ;

    }

    for(int i=0;i<m;i++)

        if(vis[i]>0){

            vis[i]--;

            rcd[l]=num[i];

            unrepeat(l+1);

            vis[i]++;

        }



}

int main(){

    while(read_input())

        unrepeat(0);



    return 0;

}

  利用STL

#include<cstdio>

#include<algorithm>

using namespace std;

const int MAXN = 1000 ;

int num[MAXN];

int n;

int input()

{

    if(scanf("%d",&n)!=1)

        return 0;

    for(int i=0;i<n;i++)

        scanf("%d",&num[i]);

    return 1;



}

int main()

{

    while(input())

    {

       sort(num,num+n);

       do

       {

           for(int i=0;i<n;i++)

                printf("%d ",num[i]);

            printf("\n");

       } while(next_permutation(num,num+n));

    }

    return 0;

}

  

你可能感兴趣的:(重复)