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