Description
设R={ r1, r2, ……, rn }是要进行排列的n个元素。其中元素r1 ,r2 ,……,rn可能相同。试设计一个算法,列出R的所有不同排列。给定n以及待排列的n个元素。计算出这n个元素的所有不同排列。
Input
输入数据的的第1行是元素个数n,1≤n≤500。接下来的1行是待排列的n个元素。
Output
将计算出的n个元素的所有不同排列输出,每种排列占1行,最后1行中的数是排列总数。
Sample Input
4 aacc
Sample Output
aacc
acac
acca
caac
caca
ccaa
6
分析:和普通求全排列问题差不多,只是多了,判断是否重复字符而已。
关于无重复元素的排列,可以参考:http://www.cnblogs.com/huashanqingzhu/p/3569835.html
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 using namespace std ; 5 long long ans; 6 int ok(char str[],int a ,int b ) 7 { 8 if(b>a) 9 for(int i=a;i<b;i++) 10 if(str[i]==str[b]) 11 return 0; 12 return 1; 13 } 14 void perm(char str[],int k,int m) 15 { 16 int i; 17 if(k==m) 18 { 19 ans++; 20 for(i=0;i<=m;i++) 21 printf("%c",str[i]); 22 printf("\n"); 23 return ; 24 } 25 else for(i=k;i<=m;i++) 26 if(ok(str,k,i)) 27 { 28 swap(str[k],str[i]); 29 perm(str,k+1,m); 30 swap(str[k],str[i]); 31 } 32 33 } 34 int main() 35 { 36 char str[505]; 37 int n,i; 38 scanf("%d",&n); 39 getchar(); 40 ans=0; 41 for(i=0;i<n;i++) 42 scanf("%c",&str[i]); 43 perm(str,0,n-1) ; 44 printf("%lld\n",ans); 45 return 0; 46 }
本文代码来自:http://blog.sina.com.cn/s/blog_9b95c19e0101aqwn.html