不重复排列

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

输入

3

1 1 2

输出

1 1 2

1 2 1

2 1 1

代码

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 const int maxn = 100;
 5 int rcd[maxn],num[maxn],vis[maxn];
 6 int n,m;
 7 int read_input()
 8 {
 9     if(scanf("%d",&n)==EOF)
10         return 0;
11     m=0;
12     memset(vis,0,sizeof(vis));
13     int i,j;
14     for( i=0;i<n;i++){
15         int val;
16         scanf("%d",&val);
17         for( j=0;j<m;j++)
18             if(num[j]==val){
19                 vis[j]++;
20                 break;
21             }
22         if(j==m){
23             num[j]=val;
24             vis[m++]++;
25         }
26 
27     }
28     return 1;
29 }
30 void unrepeat(int l){
31 
32     if(l==n){
33         for(int i=0;i<n;i++){
34             printf("%d",rcd[i]);
35             if(i<n-1)
36                 printf(" ");
37         }
38         printf("\n");
39         return ;
40     }
41     for(int i=0;i<m;i++)
42         if(vis[i]>0){
43             vis[i]--;
44             rcd[l]=num[i];
45             unrepeat(l+1);
46             vis[i]++;
47         }
48 
49 }
50 int main(){
51     while(read_input())
52         unrepeat(0);
53 
54     return 0;
55 }
View Code

利用STL的代码:

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int MAXN = 1000 ;
 5 int num[MAXN];
 6 int n;
 7 int input()
 8 {
 9     if(scanf("%d",&n)!=1)
10         return 0;
11     for(int i=0;i<n;i++)
12         scanf("%d",&num[i]);
13     return 1;
14 
15 }
16 int main()
17 {
18     while(input())
19     {
20        sort(num,num+n);
21        do
22        {
23            for(int i=0;i<n;i++)
24                 printf("%d ",num[i]);
25             printf("\n");
26        } while(next_permutation(num,num+n));
27     }
28     return 0;
29 }
View Code

 

 

posted on 2013-06-30 14:35  the unkown road  阅读(241)  评论(0编辑  收藏  举报

导航