有重復元素的排列問題
【問題描述】
設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]++;
}
}
}