生成可重集的排列-C++递归实现

题目描述:

输入一个数组p,按照字典序从小到大输出p中元素所有的排列

样例输入:

3

2 1 2

样例输出

1 2 2

2 1 2

2 2 1

#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
void print_permutation(int n,int p[],int a[],int cur)//cur指a数组中的元素个数 
{
	if(cur==n)//当数组a中的元素个数等于数组p中的元素个数时,输出数组a 
	{
		for(int i=0;i<n;i++)cout<<a[i]<<' ';
		cout<<'\n';
	}
	else for(int i=0;i<n;i++)
	if(!i||p[i]!=p[i-1])
	{
		int c1=0,c2=0;
		for(int j=0;j<cur;j++)if(a[j]==p[i])c1++;//c1指a数组中片p[i]元素的个数 
		for(int j=0;j<n;j++)if(p[j]==p[i])c2++;//c2指p数组中p[i]元素的个数 
		if(c1<c2) 
		{
			a[cur]=p[i];
			print_permutation(n,p,a,cur+1);
		}
	}
}
int main()
{
	int n;cin>>n;//n指数组的元素个数 
	int p[n];int a[n];
	memset(a,0,sizeof(a));
	for(int i=0;i<n;i++)cin>>p[i];//输入要排列的数组元素;
	sort(p,p+n);//将数组按照升序排列 
	print_permutation(n,p,a,0);	
}

猜你喜欢

转载自blog.csdn.net/achenjie/article/details/81159114