Permutation with Repetition
Description
R={ r1,r2,… ,rn }是要进行排列的n 个元素。其中元素r1,r2,… ,rn可能相同。试设计一个算法,列出R的所有不同排列。
编程任务:给定n 以及待排列的n 个元素。计算出这n 个元素的所有不同排列。
Input
输入由多组测试数据组成。每组测试数据的第1 行是元素个数n,1 <= n <= 500。接下来的1 行是待排列的n 个元素。
Output
对应每组输入,将计算出的n 个元素的所有不同排列输出,每种排列单独一行。最后1 行中的数是排列总数。
Sample Input
4 aacc
Sample Output
aacc acac acca caac caca ccaa 6
#include <iostream>
#include <cstdio>
#define N 10000
using namespace std;
int cnt;
int isOk(char *str,int a, int b)
{//此函数用于去重复排列,精华所在
if(b > a)
for(int i = a; i < b; i++)
if(str[i] == str[b])
return 0;
return 1;
}
void Swap(char &a,char &b)
{
char c;
c= a; a = b; b = c;
}
void Perm(char *str, int k, int m)
{
if(k == m)
{
printf("%s\n",str);
cnt++;
}
else
{
for(int i = k; i <= m; i++)
if(isOk(str,k,i))
{
Swap(str[i],str[k]);
Perm(str,k+1,m);
Swap(str[i],str[k]);
}
}
}
int main()
{
char str[100];
int n, i;
while(scanf("%d",&n) != EOF)
{
scanf("%s",str);
cnt = 0;
Perm(str,0,n - 1);
cout<<cnt<<endl;
}
return 0;
}