P1691 有重复元素的排列问题
题目描述
设\(R={r_1,r_2,……,r_n}\)是要进行排列的\(n\)个元素。其中元素\(r_1,r_2,……,r_n\)可能相同。使设计一个算法,列出\(R\)的所有不同排列。
给定\(n\)以及待排列的\(n\)个元素。计算出这\(n\)个元素的所有不同排列。
输入输出格式
输入格式:
第1行:元素个数\(n(1<=n<500)\)
第2行:一行字符串,待排列的\(n\)个元素
输出格式:
计算出的\(n\)个元素的所有不同排列,最后一行是排列总数。
状态有点迷,硬是想不到怎么搞。。
贴个码
#include <cstdio>
#include <algorithm>
using namespace std;
int n;
char c[510];
int cnt[27],ans=0,a[27];
void dfs(int dep)
{
if(n+1==dep)
{
//printf("1");
ans++;
for(int i=1;i<=n;i++)
printf("%c",a[i]+97);
printf("\n");
return;
}
for(int i=0;i<26;i++)
if(cnt[i])
{
a[dep]=i;
cnt[i]--;
dfs(dep+1);
cnt[i]++;
}
}
int main()
{
scanf("%d",&n);
scanf("%s",c);
sort(c,c+n);
for(int i=0;i<n;i++)
cnt[int(c[i]-'a')]++;
dfs(1);
printf("%d\n",ans);
return 0;
}
2018.5.5