有重复元素的排列问题
内存限制:256 MiB
时间限制:1000 ms
标准输入输出
题目类型:传统
评测方式:文本比较
题目描述
设R={ r1, r2 , …, rn}是要进行排列的n个元素。其中元素r1, r2 , …, rn可能相同。试设计一个算法, 列出R的所有不同排列。
给定n 以及待排列的n 个元素。计算出这n 个元素的所有不同排列。
输入格式
第1 行是元素个数n,1≤n≤500。接下来的1 行是待排列的n个元素。
输出格式
计算出的n个元素的所有不同排列输出到文件perm.out中。文件最后1行中的数是排列总数。
样例
样例输入
4
aacc
样例输出
aacc
acac
acca
caac
caca
ccaa
6
c++AC代码
#include<bits/stdc++.h>
using namespace std;
char a[100005],ans[100005];
bool flag[100005];
int sum,n;
inline void print(){
for(int i=0;i<n;i++)printf("%c",ans[i]);
printf("\n");
return;
}
inline void dfs(int tot){
if(tot==n){
print();
sum++;
return;
}
char _flag=' ';
for(int i=0;i<n;i++){
if(!flag[i]&&_flag!=a[i]){
_flag=a[i];
ans[tot]=a[i];
flag[i]=true;
dfs(tot+1);
flag[i]=false;
}
}
}
int main(){
scanf("%d\n",&n);
for(int i=0;i<n;i++)scanf("%c",&a[i]);
sort(a,a+n);
dfs(0);
printf("%d",sum);
return 0;
}