实现序列简单的全排、错排、组合

         今天做了道题,用到求错排,当然另有公式,但结合之前的编程体验,觉得求序列的全排、错排、组合很有用,于是就写了下面的简陋代码。关于有重复元素的在此没有考虑,后续补上。


求r全排列:

     当前层直接从0到n枚举当前位置的元素保证没有在已选序列中,然后进入下一层求下一个位置。

求r错排:

     当前层直接从0到n枚举当前位置的元素保证没有在已选序列中且保证不与下标冲突,然后进入下一层求下一个位置。

求r组合:

      当前层直接从i到n枚举当前位置的元素保证没有在已选序列中,然后进入下一层求下一个位置。


    下面贴贴代码:

#include<iostream>
#include<ctime>
using namespace std;

const int MAXN=10000;
int da[MAXN];
int numAns;
int daPer[MAXN];
bool visited[MAXN];
int n;

/******************************************
*
*功能:初始化函
*
*******************************************/
void init()
{
	n=5;
	for(int i =0;i<n;i++)
		da[i]=i;
}

/******************************************
*
*功能:r全排列
*
*******************************************/
void r_permutation(int numArray,int r)
{
	if(0==r)
	{
		cout<<"("<<numAns++<<") : ";
		for(int i=0;i<numArray;i++)
			cout<<daPer[i]<<"  ";
		cout<<endl;
		return ;
	}
	for(int i=0;i<n;i++)
	{
		if(!visited[i])
		{
			visited[i]=true;
			daPer[numArray]=da[i];
			r_permutation(numArray+1,r-1);
            visited[i]=false;
		}
	}
}

/******************************************
*
*功能:r错排
*
*******************************************/
void r_errorPermutation(int numArray,int r)
{
	if(0==r)
	{
		cout<<"("<<numAns++<<") : ";
		for(int i=0;i<numArray;i++)
			cout<<daPer[i]<<"  ";
		cout<<endl;
		return ;
	}
	for(int i=0;i<n;i++)
	{
		if(numArray!=i&&!visited[i])
		{
			visited[i]=true;
			daPer[numArray]=da[i];
			r_errorPermutation(numArray+1,r-1);
            visited[i]=false;
		}
	}
}

/******************************************
*
*功能:r组合
*
*******************************************/
void r_combination(int numArray,int id,int r)
{
	if(0==r)
	{
		cout<<"("<<numAns++<<") : ";
		for(int i=0;i<numArray;i++)
			cout<<daPer[i]<<"  ";
		cout<<endl;
		return ;
	}
	for(int i=id;i<n;i++)
	{
		if(!visited[i])
		{
			visited[i]=true;
			daPer[numArray]=da[i];
			r_combination(numArray+1,i+1,r-1);
            visited[i]=false;
		}
	}
}


int main()
{
	init();
	
	cout<<"全排列:"<<endl;
	numAns=0;
	memset(visited,false,sizeof(visited));
	r_permutation(0,2);
	
	
	cout<<endl<<"错排:"<<endl;
	numAns=0;
	memset(visited,false,sizeof(visited));
	r_errorPermutation(0,2);

	cout<<endl<<"组合:"<<endl;
	numAns=0;
	memset(visited,false,sizeof(visited));
	r_combination(0,0,2);
	
	return 0;
}

     可能不欠缺的地方,欢迎斧正!

你可能感兴趣的:(数学,排列组合)