组合序列:
void conbination(int n,int m,int a[],int b[],const int &M){ for(int j=m;j<=n;j++){ b[m-1]=a[j-1]; if(m>1) conbination(j-1,m-1,a,b,M); else{ for(int i=0;i<M;i++) printf("%d ",b[i]); printf("\n"); } } }
递归图解:
全排列:
void swap(int *p1,int *p2){ int t=*p1; *p1=*p2; *p2=t; } void full_permutation(int a[],int t,int size){ if(t==size){ for(int i=0;i<size;i++) printf("%d ",a[i]); printf("\n"); } else{ for(int j=t;j<size;j++){ swap(&a[j],&a[t]); full_permutation(a,t+1,size);//此处用到递归思想 swap(&a[j],&a[t]); } } }
将组合后的序列进行全排列,就得到了排列序列:
排列序列:
void permutation(int n,int m,int a[],int b[],const int &M){ for(int j=m;j<=n;j++){ b[m-1]=a[j-1]; if(m>1) permutation(j-1,m-1,a,b,M); else{ full_permutation(b,0,M); } } }
测试代码:
#include <stdio.h> #include <memory.h> #include <math.h> #include <string.h> #include <string> #include <vector> #include <set> #include <stack> #include <queue> #include <algorithm> #include <map> #define I scanf #define OL puts #define O printf #define F(a,b,c) for(a=b;a<c;a++) #define FF(a,b) for(a=0;a<b;a++) #define FG(a,b) for(a=b-1;a>=0;a--) #define LEN 100 #define MAX 0x06FFFFFF #define V vector<int> using namespace std; void conbination(int n,int m,int a[],int b[],const int &M){ for(int j=m;j<=n;j++){ b[m-1]=a[j-1]; if(m>1) conbination(j-1,m-1,a,b,M); else{ for(int i=0;i<M;i++) printf("%d ",b[i]); printf("\n"); } } } void swap(int *p1,int *p2){ int t=*p1; *p1=*p2; *p2=t; } void full_permutation(int a[],int t,int size){ if(t==size){ for(int i=0;i<size;i++) printf("%d ",a[i]); printf("\n"); } else{ for(int j=t;j<size;j++){ swap(&a[j],&a[t]); full_permutation(a,t+1,size);//此处用到递归思想 swap(&a[j],&a[t]); } } } void permutation(int n,int m,int a[],int b[],const int &M){ for(int j=m;j<=n;j++){ b[m-1]=a[j-1]; if(m>1) permutation(j-1,m-1,a,b,M); else{ full_permutation(b,0,M); } } } int main(){ int n=5,m=3; int a[n];int b[m]; for(int i=0;i<n;i++) a[i]=i+1; const int M=m; puts("组合序列"); conbination(n,m,a,b,M); puts("全排列"); full_permutation(a,0,n); puts("排列序列"); permutation(n,m,a,b,M); return 0; }