包含重复元素的全排列
2016-11-21 21:15
274 查看
#include<iostream> #include<fstream> #include<algorithm> using namespace std; int n = 0;//统计全排列个数 ofstream out("output.txt"); // 交换 template<class Type> void Swap(Type &a, Type &b) { Type temp = a; a = b; b = temp; } // 判断是否是重复元素交换 template<class Type> bool isSwap(Type list[], int k, int m) { for (int i = k; i < m; i++) if (list[i] == list[m]) return false; return true; } //全排列,每次只取一个出来,Perm(r1)表示Perm中不含r1,并且由r1开头。 template<class Type> void Perm(Type list[], int k, int m) { // 产生list[k:m]的所有排列 if (k == m) { // 只剩下一个元素 for (int i = 0; i <= m; i++) { out << list[i]; } out << endl; n++; } else { // 还有多个元素待排列,递归产生排列 for (int i = k; i <= m; i++) { if (isSwap(list, k, i)) { // 判断是否为重复元素交换 Swap(list[k], list[i]); Perm(list, k + 1, m); Swap(list[k], list[i]); } } } } int main() { ifstream in("input.txt"); if (!in) { cout << "In Error!" << endl; exit(-1); } if (!out) { cout << "Out Error!" << endl; exit(-1); } int l; in >> l; char* a = new char[l]; in.get(); for (int i = 0; i < l; i++) { in >> a[i]; } Perm(a, 0, l - 1); out << n << endl; in.close(); out.close(); system("pause"); return 0; }
实验结果
相关文章推荐
- 输出一组元素的全排列(可包含重复元素)
- 集合的全排列(可包含重复元素)
- 递归实现全排列(可包含重复元素)
- 有重复元素的全排列
- [转]个数为n的只读数组包含元素[1, n-1],求其中一个重复的数
- 求输入字符串的全排列 (无重复元素)
- 是否包含重复元素2
- 含重复元素的全排列
- 计数与概率基础(容斥、有重复元素的全部排列、可重复选择的全排列、杨辉、二项式定理、欧拉函数)
- 含重复元素序列的全排列
- 如何在Java中构建一个不包含重复元素的List
- 九章算法面试题54 带重复元素的全排列
- Java_数组操作_合并数组,使合并后的数组中不包含重复的元素
- 从n个元素中选择k个的所有组合(包含重复元素)
- 如何得到有重复元素的不重复全排列
- 面试题------全排列的非递归和递归实现(含重复元素)
- 字符串的排列(全排列,包含重复的字符)
- 全排列算法:不含重复元素,包含重复元素,字母序排列
- 全排列的java实现(无重复元素)
- 有重复元素的全排列