1. 程式人生 > >洛谷 P1691 解題報告

洛谷 P1691 解題報告

怎麽 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 解題報告