排列组合问题~有重复元素的排列问题(perm)——【S神】苏嘉亿

Description
设 R=R=R={r1,r2,…,rnr_1,r_2,…,r_nr1​,r2​,…,rn​} 是要进行排列的 nnn 个元素。其中元素 r1,r2,…,rnr_1,r_2,…,r_nr1​,r2​,…,rn​ 是小写字母,且可能相同。试设计一个算法, 列出 RRR 的所有不同排列。给定 nnn 以及待排列的 nnn 个元素。计算出这 nnn 个元素的所有不同排列。

Input
输入第 111 行是元素个数 n(1≤n≤500)n(1≤n≤500)n(1≤n≤500) 。接下来的 111 行是待排列的 nnn 个元素。

Output
按字典序输出 nnn 个元素的所有排列,最后 1 行中的数是排列总数。

Sample Input 1

4
aacc

Sample Output 1

aacc
acac
acca
caac
caca
ccaa
6

代码:

#include
using namespace std;

int a['z'+1];
char ans[510];
int n,tot;

void dfs(int t){
 if(t>n){
  for(int i=1;i<=n;i++){
   cout<<ans[i];
  }
  cout<<endl;
  tot++;
  return;
 }
 for(char i='a';i<='z';i++){
  if(a[i]>0){
   ans[t]=i;
   a[i]--;
   dfs(t+1);
   a[i]++;
  }
 }
}

int main(){
 string s;
 cin>>n>>s;
 for(int i=0;i<s.size();i++){
  a[s[i]]++;
 }
 dfs(1);
 cout<<tot; 
 return 0;
}

你可能感兴趣的:(c++)