8594 有重复元素的排列问题 |
设集合R={r1,r2,...,rn}是要进行排列的n个元素,其中r1,r2,...,rn可能相同。 试着设计一个算法,列出R的所有不同排列。 即,给定n以及待排的n个可能重复的元素。计算输出n个元素的所有不同排 输入格式第1行是元素个数n,1<=n<=15。接下来的1行是待排列的n个元素,元素中间不要加空格。 输出格式程序运行结束时,将计算输出n个元素的所有不同排列。最后1行中的数是排列总数。 (说明: 此题,所有计算出的排列原本是无所谓顺序的。但为了容易评判,输出结果必须唯一! 现做约定:所有排列的输出顺序如课本例2-4的程序段的输出顺序,区别仅是这道题是含 重复元素。) |
#include <iostream>
#include <stdio.h>
using namespace std;
void Swap(char &a,char &b)
{
char c;
c = a;
a = b;
b = c;
}
bool FindSame(char list[],int k,int i)
{
if(i>k)
{
for(int j=k;j<i;j++)
if(list[i] == list[j])
return true;
}
return false;
}
int perm(char list[],int k,int m)
{ static int count = 0;
if(k == m)
{
for(int i = 0;i <= m;i++) cout<<list[i];
count++;
cout<<endl;
}
else //还有多个元素待排列
{
for(int i = k;i<=m;i++)
{
if(FindSame(list,k,i)) continue;
Swap(list[k],list[i]);
perm(list,k+1,m);
Swap(list[k],list[i]);
}
}
return count;
}
int main()
{ //主函数,功能:输入字符数组并调用全排列函数
int i,n,c;
scanf("%d",&n);
char *a = new char[n];
getchar();//吸收掉一个回车
for(i=0;i<n;i++)
scanf("%c",&a[i]);
a[n] = '\0';
c = perm(a,0,n-1);
printf("%d",c);
return 0;
}