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