普通集合的排列:
#include"iostream"
using namespace std;
int num[100];
int a[100];
int n;
void next_permutation(int a[],int cur) //从cur 构造序列
{
if(cur==n) //递归边界 当长度达到了序列的长度打印
{
for(int i=0;i<cur;i++)
cout<<a[i]<<" ";
cout<<endl;
return;
}
for(int i=0;i<n;i++) //选出一个元素 赋值给a[cur]
{
int ok=1;
for(int j=0;j<cur;j++) //检查这个元素是否合法
if(num[i]==a[j]) {ok=0;break;} //如果在0...cur-1中出现过说明不可选
if(ok) //如果可选 赋值给a[cur],继续构造。
{
a[cur]=num[i];
next_permutation(a,cur+1);
}
}
}
int main()
{
while(cin>>n)
{
int i;
for(i=0;i<n;i++)
cin>>num[i];
cout<<"集合的全排列:"<<endl;
next_permutation(a,0);
}
}
可重集:
#include"iostream"
#include"map"
using namespace std;
int num[100];
int a[100];
int n;
void next_permutation2(int a[],int cur) //从cur 构造序列
{
if(cur==n) //递归边界 当长度达到了序列的长度打印
{
for(int i=0;i<cur;i++)
cout<<a[i]<<" ";
cout<<endl;
return;
}
for(int i=0;i<n;i++) //选出一个元素 赋值给a[cur]
{
map<int,int>cnt1;
map<int,int>cnt2;
for(int j=0;j<cur;j++) cnt1[a[j]]++;
for(int j=0;j<n;j++) cnt2[num[j]]++;
if(cnt1[num[i]]<cnt2[num[i]])
{
a[cur]=num[i];
next_permutation2(a,cur+1);
}
}
}
void next_permutation(int a[],int cur) //从cur 构造序列
{
if(cur==n) //递归边界 当长度达到了序列的长度打印
{
for(int i=0;i<cur;i++)
cout<<a[i]<<" ";
cout<<endl;
return;
}
for(int i=0;i<n;i++) //选出一个元素 赋值给a[cur]
{
int c1,c2;c1=c2=0;
for(int j=0;j<cur;j++) if(a[j]==num[i]) c1++; //在a[0...cur-1]中等于num[i]的元素的个数
for(int j=0;j<n;j++) if(num[j]==num[i]) c2++; //在num[0...n-1]中等于num[i]的元素的个数
if(c1<c2) //说明这个元素还没有用完,可以选择
{
a[cur]=num[i];
next_permutation(a,cur+1);
}
}
}
int main()
{
while(cin>>n)
{
int i;
for(i=0;i<n;i++)
cin>>num[i];
cout<<"可重集合的全排列:"<<endl;
next_permutation(a,0);
cout<<"可重集合的全排列:"<<endl;
next_permutation2(a,0);
}
}
STL 函数next_permutation(_BidirectionalIterator __first,_BidirectionalIterator __last):
#include"iostream"
#include"map"
#include"algorithm"
using namespace std;
int num[100];
int a[100];
int n;
int main()
{
while(cin>>n)
{
int i;
for(i=0;i<n;i++)
cin>>num[i];
do
{
for(i=0;i<n;i++)
cout<<num[i]<<" ";
cout<<endl;
}while(next_permutation(num,num+n));
}
}