求所有的子集,一下子就想到回溯,回溯有两个模板,一个是组合combition,一个是全排列oermutation。
/* 组合combination: n代表几个数,或者说树的深度。 path代表回溯过程中多叉树节点的值 depth代表path的下标 start开始位置。在组合中dfs是i+1,如果允许重复则为i。 */ void dfs(int *nums,int numsSize,int *returnSize,int** returnColumnSizes,int **result,int *path,int depth,int start,int n) { if(depth==n) { result[*returnSize]=(int *)malloc(sizeof(int)*depth); for(int i=0;i<depth;i++){ printf("%d ",path[i]); result[*returnSize][i]=path[i]; } printf(" "); *returnSize++; return; } for(int i=start;i<numsSize;i++) { path[depth]=nums[i]; dfs(nums,numsSize,returnSize,returnColumnSizes,result,path,depth+1,i+1,n); } } /* 全排列permutation: n代表几个数,或者说树的深度。 path代表回溯过程中多叉树节点的值 depth代表path的下标 used用来记录该数是否使用过,初始化为全1,用calloc初始化。 */ void dfs(int *nums,int numsSize,int *returnSize,int** returnColumnSizes,int **result,int *path,int depth,int n) { if(depth==n) { result[*returnSize]=(int *)malloc(sizeof(int)*depth); for(int i=0;i<depth;i++){ printf("%d ",path[i]); result[*returnSize][i]=path[i]; } printf(" "); *returnSize++; return; } for(int i=0;i<numsSize;i++) { if(used[i]) continue; used[i]=1; path[depth]=num[i]; dfs(nums,numsSize,returnSize,returnColumnSizes,result,path,depth+1,n); used[i]=0; } }
/* */ #include<stdio.h> #include<malloc.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<string.h> #include<iostream> void dfs(int *nums,int numsSize,int *returnSize,int** returnColumnSizes,int **result,int *path,int depth,int start,int n) { if(depth==n) { if(depth==0){ result[*returnSize++]=NULL; //returnColumnSizes[0][*returnSize]=0; return; } result[*returnSize]=(int *)malloc(sizeof(int)*depth); for(int i=0;i<depth;i++) if(path[i]){ printf("%d ",path[i]); result[*returnSize][i]=path[i]; } //returnColumnSizes[0][*returnSize]=depth; printf(" "); *returnSize++; return; } for(int i=start;i<numsSize;i++) { path[depth]=nums[i]; dfs(nums,numsSize,returnSize,returnColumnSizes,result,path,depth+1,i+1,n); } } int** subsets(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){ int len=pow(2,numsSize),i; int **result=(int **)malloc(sizeof(int *)*len); int *path=(int *)malloc(sizeof(int)*numsSize); *returnSize=0; //returnColumnSizes[0]=(int*)malloc(sizeof(int)*100); for(i=0;i<=numsSize;i++){ dfs(nums,numsSize,returnSize,returnColumnSizes,result,path,0,0,i); } return result; } int main() { int* nums, numsSize=3,a[3]={1,2,3},*returnSize,** returnColumnSizes,i,j; nums=(int*)malloc(sizeof(int)*3); returnSize=(int*)malloc(sizeof(int)); *returnSize=3; returnColumnSizes=(int**)malloc(sizeof(int*)*100); nums=a; int **rs=subsets(nums,numsSize,returnSize,returnColumnSizes); //printf("%d ",rs[0][0]); return 0; }