题目描述
设R={r1,r2,……,rn}是要进行排列的n个元素。其中元素r1,r2,……,rn可能相同。使设计一个算法,列出R的所有不同排列。
给定n以及待排列的n个元素。计算出这n个元素的所有不同排列。
输入输出格式
输入格式:
第1行:元素个数n(1<=n<500)
第2行:一行字符串,待排列的n个元素
输出格式:
计算出的n个元素的所有不同排列,最后一行是排列总数。
输入输出样例
输入样例#1:
4
aacc
输出样例#1:
aacc
acac
acca
caac
caca
ccaa
6
解题思路:
R={r1,r2,r3.....},根据分治法的思想可令M1={r1}、M2={r2,r3,r4......},则可以对M1、M2进行全排列,此后可以依次类推.....
实现代码:
#include <iostream>
using namespace std;
char strToChar[100];
int total;
//第i个元素是否在前面的元素[k...i-1]中出现过
bool duplicate(char charList[],int k,int i){
if(i>k){
for(int j=k;j<i;j++){
if(charList[j] == charList[i])
return false;
}
}
return true;
}
//将两个元素交换位置
void swapList(char charList[],int k,int i){
char temp;
temp=charList[k];
charList[k]=charList[i];
charList[i]=temp;
}
void permute(char charList[],int k,int m){
if(k==m){
total++;
for(int i=0;i<=m;i++){
cout<<charList[i];
}
cout<<endl;
return;
}
for(int i=k;i<=m;i++){
//cout<<"i="<<i<<",k="<<k<<endl;
if(duplicate(charList,k,i)){
swapList(charList,k,i);
permute(charList,k+1,m);
//cout<<"okkk"<<endl;
swapList(charList,k,i);
}
}
}
int main()
{
while(true){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>strToChar[i];
}
cout<<endl;
permute(strToChar,0,n-1);
cout<<endl;
cout<<total<<endl;
cout<<"---------------------------------"<<endl;
}
return 0;
}