首页 > 其他 > 详细

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

时间:2014-01-21 01:10:25      阅读:644      评论:0      收藏:0      [点我收藏+]

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


求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;
}

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

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

原文:http://blog.csdn.net/xj2419174554/article/details/18327073

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!