有重复元素的排列问题
【问题描述】
设R={ r1, r2 , …, rn}是要进行排列的n个元素。其中元素r1, r2 , …, rn可能相同。试设计一个算法,列出R的所有不同排列。
【编程任务】
给定n 以及待排列的n 个元素。计算出这n 个元素的所有不同排列。
【输入格式】
由perm.in输入数据。文件的第1 行是元素个数n,1≤n≤500。接下来的1 行是待排列的n个元素。
【输出格式】
计算出的n个元素的所有不同排列输出到文件perm.out中。文件最后1行中的数是排列总数。
【输入样例】
4
aacc
【输出样例】多解
aacc
acac
acca
caac
caca
ccaa
6
代码如下:
/*跟排列组合相似,只需加一个计数器避免重复*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int search(int);
int sum;
int print();
bool b[600];
int n,count[100];
string s;
char q[100];
int main()
{
cin>>n>>s;
for(int i=0;i<n;i++)
{
count[s[i]-96]++;//记录出现的次数
}
search(0);
cout<<sum<<endl;
return 0;
}
int print()
{
sum++;
for(int i=0;i<n;i++)
cout<<q[i];
cout<<endl;
}
int search(int x)
{
for(int i=1;i<=26;i++)
{
if(count[i])//仍出现
{
q[x]=s[i-1];
count[i]--;
if(x==n-1)print();
else
search(x+1);
count[i]++;
}
}
}