3126 - 重复元素全排列问题
设有n个元素要进行全排列,其中可能有相同的元素,例如abcc,设计一个算法,列出n个元素的不同排列。
Input
第一行:输入元素的个数n
第二行:输入n个元素
Output
输出n个元素的不同不同排列,每个排列一行。
最后一行为排列的个数。
Examples
Input
4 aacc
Output
aacc acac acca caac caca ccaa 6
Solution C
#include <stdio.h> #include <stdlib.h> #define SIZE 100 #define bool int #define false 0 #define true 1 int num = 0; int contains(char str[SIZE], int k, int i) { for (int j = k; j < i; j++) { if (str[i] == str[j]) return true; } return false; } void MySwap(char *a, char *b) { char temp; temp= *a; *a = *b; *b = temp; } void Perm(char str[SIZE], int k, int m) { if (k == m) { for (int i = 0; i <= m; i++) printf("%c",str[i]); num++; printf("\n"); } else { for (int i = k; i <= m; i++) { if (!contains(str, k, i)) { MySwap(&str[k], &str[i]); Perm(str, k+1, m); MySwap(&str[k], &str[i]); } } } } int main() { int n; scanf("%d",&n); char s[SIZE]; scanf("%s", s); Perm(s, 0, n-1); printf("%d\n",num); return 0; }
Solution C++
#include<iostream> #include<string> using namespace std; string res[100]; int n; int swap(char &a, char &b){ char temp; temp = a; a = b; b = temp; return 0; } void ex(){ int sum = 0,t = 0,flag = 1; string ss[100]={""}; for(int i = 0; i < n; i++){ for(int j = t; j >0; j--) if(ss[j] == res[i]) flag = 0; if(flag){ ss[++t] = res[i]; sum++; cout << ss[t] << endl; } flag = 1; } cout << sum; } int perm(string s, int k, int m){ if(k == m - 1){ static int c = 0; res[c] = s; c++; n = c; }else{ for(int i = k; i < m; i++){ swap(s[k],s[i]); perm(s,k+1,m); swap(s[k],s[i]); } } return 0; } int main(){ string s; int n; cin >>n >>s; perm(s, 0 ,s.length()); ex(); return 0;}