有重复元素的排列(DFS)
题目描述:
设R={ r1, r2 , …, rn}是要进行排列的n个元素。其中元素r1, r2 , …, rn均为小写字母并且可能相同。试设计一个算法,列出R的所有不同排列。
给定n 以及待排列的n 个元素。计算出这n 个元素的所有不同排列。
输入格式:
第1 行是元素个数n,1≤n≤500。接下来的1 行是待排列的n个元素。
输出格式:
计算出的n个元素的所有不同排列
最后1行中的数是排列总数
样例输入:
4 aacc
样例输出:
aacc acac acca caac caca ccaa 6
思路:这题特别明显了,深搜。枚举每一个组合的可能(前提是不重复)。
上我的垃圾代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; char b[1000],c; int a[100],n,num; void dfs(int pos){ if(pos>n){ num++; for(int i=1;i<=n;i++)printf("%c",b[i]); printf("\n"); return; } for(int i=1;i<=26;i++) if(a[i]>0){ b[pos]=char(i+96); a[i]--; dfs(pos+1); a[i]++; } } int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>c; a[c-('a'-1)]++; } dfs(1); cout<<num<<endl;//输出种数 return 0; }