描述
输入格式
第1行是元素个数n,1<=n<=15。接下来的1行是待排列的n个元素,元素中间不要加空格。
输出格式
程序运行结束时,将计算输出n个元素的所有不同排列。最后1行中的数是排列总数。 (说明: 此题,所有计算出的排列原本是无所谓顺序的。但为了容易评判,输出结果必须唯一! 现做约定:所有排列的输出顺序如课本P11的例2-4的程序段的输出顺序,区别仅是这道题是含重复元素。)
输入样例
4 aacc
输出样例
aacc acac acca caac caca ccaa 6
Hint
1,在准备开始第i个元素打头的全排列罗列时,即Swap(a[k],a[i])之前,先判断a数组中第i个元素是否在前面元素a[k...i-1]中出现过, 未出现过,此过程照旧继续,若出现过,这次以i元素打头的排列输出跳过。 2,在输出时,加一个判断,判断在a数组中a[k...m]所有元素是否相等,相等输出一次即可。
#include <iostream> using namespace std;
int ElemCount = 0; // 交换元素 void swap(char &a, char &b) { char tmp; tmp = a; a = b; b = tmp; }
// 递归全排列 void perm(char c[], int s, int e) { if(s == e) { // 开始index == 结束index for( int i = 0; i <= e; i ++) cout << c[i]; cout << endl; ElemCount ++; }else { for(int i = s; i <= e; i++) { int mark = 0; for(int j = s; j < i; j ++) { if(c[j] == c[i]) { mark = 1; break; } } if(1 == mark) continue; swap(c[s], c[i]); perm(c, s + 1, e); swap(c[s], c[i]); } } }
int main() { int n; char c[16]; char tmp; std::cin >> n; tmp = getchar(); // 接受回车 if(1 <= n && n <= 15) { for( int i = 0; i < n; i ++) { c[i] = getchar(); } perm(c, 0, n - 1); cout << ElemCount << endl; } return 0; }