不重复排列
输入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 }
利用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 }
posted on 2013-06-30 14:35 the unkown road 阅读(241) 评论(0) 编辑 收藏 举报