问题描述
设R={ r1, r2, ……, rn }是要进行排列的n个元素,其中元素r1 ,r2 ,……,rn可能相同。设计一个算法,列出R的所有不同排列。
编程任务
键盘输入元素个数n以及待排列的n个元素,输出这n个元素的所有不同排列、以及排列总数。
实验代码
C++版
#include<iostream>
using namespace std;
static int i = 0; /*统计排列总数*/
int whetherChange(char list[], int k, int i);
void Perm(char list[], int k, int m);
int main() {
int n;
cout << "请输入元素个数:";
cin >> n;
char* list = new char[n];
cout << "请输入元素,使用空格分隔开" << endl;
for (int i = 0; i < n; i++) {
cin >> list[i];
}
cout << "所有不同的排列为:" << endl;
Perm(list, 0, n - 1);
cout << "排列总数为:" << i << endl;
delete[] list;
return 0;
}
/*判断是否进行交换,将待交换元素与已交换元素进行比较,若相同则不需要交换,返回0*/
int whetherChange(char list[], int k, int i) {
if (i > k)
{
for (int j = k; j < i; j++)
{
if (list[j] == list[i]) return 0; /*是重复元素,不交换*/
}
}
return 1;
}
void Perm(char list[], int k, int m) {
if (k == m) {
for (int i = 0; i <= m; i++)
cout << list[i];
cout << endl;
i++;
}
else {
for (int i = k; i <= m; i++) {
if (whetherChange(list, k, i)) {
swap(list[k], list[i]);
Perm(list, k + 1, m);
swap(list[i], list[k]);
}
}
}
}
运行结果