算法实现题 2-8: 有重复元素的排列问题
问题描述:
设 R={ r1 ,r2 ,…,rn }是要进行排列的 n 个元素。其中元素r1 ,r2 ,,rn 可能相同。试设计
一个算法,列出 R 的所有不同排列。
编程任务:
给定 n 以及待排列的 n 个元素。计算出这 n 个元素的所有不同排列。
低配版该问题
#include<bits/stdc++.h>
using namespace std;
char s[1001];
int cnt=0;
//判断是否是重复元素
int Juade(int a,int b)
{
for(int i=a;i<b;i++)
{
if(s[i]==s[b])
return 0;
}
return 1;
}
void perm(int k,int m)
{
if(k==m)//结束条件 输出结果
{
for(int i=0;i<=m;i++)
cout<<s[i]<<" ";
cout<<endl;
cnt++;
}
else
{
for(int j=k;j<=m;j++)
{
if(Juade(k,j))
{
swap(s[j],s[k]);
perm(k+1,m);
swap(s[j],s[k]);//防止出现重复结果
}
}
}
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>s[i];
perm(0,n-1);
cout<<cnt<<endl;
}
测试用例: