有重复元素的排列问题
时间限制: 2 Sec 内存限制: 128 MB[ 提交][ 状态][ 讨论版]
题目描述
对n个元素进行全排列。这n个元素由小写字母组成,这n个元素中的某些可能相同。
[输入格式] 1<=n<=500
[输出格式]
每行一个序列,按字典序输出最后一行输出方案数
[输入样例]
4
aacc
[输出样例]
aacc
acac
acca
caac
caca
ccaa
6
#include<stdio.h>
#include<string.h>
int n,i,s,a[505],b[505],r;
char c[505];
int dfs(int step)
{
if(step==n+1) //输出
{
s++; //总的个数
for(int i=1;i<=n;i++)
printf("%c",b[i]+'a'-1);
printf("\n");
return 0;
}
for(int i=1;i<=26;++i)
if(a[i]>0)
{
b[step]=i;
a[i]--;
dfs(step+1); //递归
a[i]++; //若完成或失败则最后返回上一个不相同的元素
}
}
int main()
{
scanf("%d",&n);
scanf("%s",c);
for(i=0;i<n;i++)
a[c[i]-'a'+1]++;
dfs(1);
printf("%d\n",s);
return 0;
}