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 }