洛谷 P1691 解題報告
阿新 • • 發佈:2018-05-06
怎麽 pan oid lin urn sca printf dep can
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
洛谷 P1691 解題報告