原理:递归与分治
问题描述:
设集合R={r1,r2,...,rn}是要进行排列的n个元素,其中r1,r2,...,rn可能相同。
试着设计一个算法,列出R的所有不同排列。即,给定n以及待排的n个可能重复的元素。计算输出n个元素的所有不同排列。
测试输入:4
aacc
预期输出:aacc
acac
acca
caac
caca
ccaa
6
c++代码:
#include <bits/stdc++.h>
using namespace std;
const int N=101;
char str[N];
int cnt=0;
typedef char Type;
void swap(Type *a,Type *b){
Type t=*a;
*a=*b;
*b=t;
}
int findsame(char str[],int k,int last){
for(int i = k; i < last; i++) {
if(str[i]==str[last]) return 1;
}
return 0;
}
void permutation(char str[],int k,int len){
if(k==len){
cnt++;
for(int i=1;i<=len;i++)
cout<<str[i];
cout<<"\n";
}else{
for(int i=k;i<=len;i++){
if(findsame(str,k,i)){
continue;
//这是本题关键
//如果str[k]到str[i-1]里有和str[i]重复的元素,则跳过本次循环。
}
swap(str[i],str[k]);
permutation(str,k+1,len);
swap(str[i],str[k]);
}
}
}
int main(){
int len;
cin>>len;
for(int i=1;i<=len;i++){
cin>>str[i];
}
permutation(str,1,len);
cout<<cnt;
}