算法实现题 2-8 有重复元素的排列问题
问题描述:
设 R={ r1 ,r2 ,…,rn }是要进行排列的 n 个元素。其中元素r1 ,r2 ,…,rn 可能相同。试设计
一个算法,列出 R 的所有不同排列。
编程任务:
给定 n 以及待排列的 n 个元素。计算出这 n 个元素的所有不同排列。
数据输入:
由文件 input.txt 提供输入数据。文件的第 1 行是元素个数 n,1£n£500。接下来的 1 行
是待排列的 n 个元素。
结果输出:
程序运行结束时,将计算出的 n 个元素的所有不同排列输出到文件 output.txt 中。文件
最后 1 行中的数是排列总数。
输入文件示例
4
aacc
输出文件示例
aacc
acac
acca
caac
caca
ccaa
6
AC
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
char xx[9999];
int cnt=0;
int findsame(int k,int m) {
for(int i=k; i<m; i++) {
if(xx[i]==xx[m])
return 1;
}
return 0;
}
void perm(int k,int m) {
if(k==m) {
for(int i=0; i<=m; i++) {
cout<<xx[i];
}
cout<<endl;
cnt++;
} else {
for(int i=k; i<=m; i++) {
if(findsame(k,i))
continue;
swap(xx[k],xx[i]);
perm(k+1,m);
swap(xx[k],xx[i]);
}
}
}
int main() {
int n;
cout<<"请输入元素个数:\n" ;
cin>>n;
cout<<"请输入"<<n<<"个不同的元素:\n" ;
for(int i=0; i<n; i++)
cin>>xx[i];
perm(0,n-1);
cout<<"count="<<cnt;
return 0;
}