求一个全排列函数: 如p([1,2,3])输出:[123],[132],[213],[231],[312],[321]. 求一个组合函数 如p([1,2,3])输出:[1],[2],[3],[1,2],[2,3],[1,3],[1,2,3]
深度搜索的代码:
#include<stdio.h> #include<string.h> const int Max = 1010; int n; int a[Max]; bool b[Max]; void Dfs(int num) { if(num==n) { for(int i=0;i<n;i++) printf("%d",a[i]); printf("\n"); } else { for(int i=1;i<=n;i++) if(!b[i]) { b[i]=true; a[num]=i; Dfs(num+1); b[i]=false; } } } int main() { while(scanf("%d",&n)!=EOF) { memset(b,false,sizeof(b)); Dfs(0); } return 0; }
采用字典序的排序的方法 :
http://www.cnblogs.com/biyeymyhjob/archive/2012/07/13/2589738.html
思路:设一个数组a,数组a中的数必须是0和1当中的一个,将待组合数每一个数关联到数组中,接着按照二进制的规则,对数组a构建成的二进制数一步一步加1,在这个过程中,数组a每次构建一个二进制的数,对应数组为1的待组合数集合当中的数立即输出,构成一次组合,依次类推。
#include<stdio.h> #include<math.h> int main() { int n,bit; int i,j,m; while(scanf("%d",&n)!=EOF) { m=pow(2,n); for(i=1;i<m;i++) { j=i; bit=1; while(j) { if(j%2)printf("%d",bit); j/=2; bit++; } printf("\n"); } } return 0; }
采用字典序的排序的方法 :
http://www.cnblogs.com/biyeymyhjob/archive/2012/07/13/2589738.html