参考资料:
http://bbs.pediy.com/showthread.php?t=167693
http://www.cnblogs.com/autosar/archive/2012/04/08/2437799.html
/* */ #include <Windows.h> #include <stdio.h> char comb_array[]={'A','B','C','D','E','F','G','H','I','J'}; char perm_array[]={'A','B','C'}; char temp[9]={0}; int top=0; void comb(int s,int n,int k) //从左边第s个元素开始选择 { if (s > n) { return; } if (top == k) //如果temp中的元素已达到k个,打印出该组合 { for (int i=0;i<k;i++) { printf("%c",temp[i]); } printf("\n"); return; } temp[top++]=comb_array[s];//把第s个元素放进temp comb(s+1,n,k); //如果temp中的元素不够k,顺序再选择一个 top--; //从temp中去掉最后选进的元素,顺序再选择一个 comb(s+1,n,k); } void comb2(int n,int k) { int i; if (k==0) { i=0; do { printf("%c",temp[i]); i++; }while(temp[i]!=0); printf("\n"); return; } for (int j=n;j>=k;j--) { temp[k-1]=comb_array[j-1]; //反向选择一个元素,放入temp中 if (k>1) { comb2(j-1,k-1); //剩余的集合(n-1)进行一次(k-1)组合 } else { i=0; do { printf("%c",temp[i]); i++; }while(temp[i]!=0); printf("\n"); } } } char flag[9]={0}; void perm(int m,int n) //P(n,m) { if (m>=n) { for (int i=0;i<n;i++) { printf("%c",temp[i]); } printf("\n"); return; } for (int i=0;i<n;i++) { if (flag[i]==0) { flag[i]=1; //取出第i个 temp[m]=perm_array[i]; perm(m+1,n); //取后面的元素,直到m=n flag[i]=0; //标识第i个已取 } } } void swap(int i,int j) { char t=perm_array[i]; perm_array[i]=perm_array[j]; perm_array[j]=t; } void perm2(int m,int n) { if (m>=n) { for (int i=0;i<n;i++) { printf("%c",perm_array[i]); } printf("\n"); return; } for (int j=m;j<n;j++) { swap(m,j); //从未选出的集合(第m个-第n个)中选出一个元素j perm2(m+1,n); //继续选出直到m>=n swap(m,j); } } void main() { //perm(0,3); //perm2(0,3); //comb(0,5,3); //comb2(5,3); return; }