/*
* < Question 8594 >
* 设集合R={r1,r2,...,rn}是要进行排列的n个元素,其中r1,r2,...,rn可能相同。
* 试着设计一个算法,列出R的所有不同排列。
* 即,给定n以及待排的n个可能重复的元素,计算输出n个元素的所有不同排列。
*/
#include <iostream>
#include <vector>
using namespace std;
int element_number;
vector<int> default_seq;
int seq_number = 0;
bool FindSame(vector<int> seq,int begin,int end) {
for (int i = begin; i < end; ++i) {
if (seq[i] == seq[end]) {
return true;
}
}
return false;
}
void Perm(vector<int> seq, int current_number) {
if (current_number == element_number) {
for (int i = 0; i < element_number; ++i) {
cout << (char)seq[i];
}
cout << endl;
seq_number ++;
}
else {
for (int i = current_number; i < seq.size(); ++i) {
if (FindSame(seq, current_number, i))//判断第i个元素是否在list[k,i-1]中出现过
continue;
swap(seq[current_number], seq[i]);
Perm(seq, current_number + 1);
swap(seq[current_number], seq[i]);
}
}
}
int main() {
cin >> element_number;
char ch;
default_seq = vector<int>(element_number);
for(int i = 0; i < element_number; i++) {
cin >> ch;
default_seq[i] = ch;
}
Perm(default_seq, 0);
cout << seq_number << endl;
return 0;
}
有重复元素的排列问题
于 2021-10-09 13:42:35 首次发布