求所有的子集,一下子就想到回溯,回溯有两个模板,一个是组合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; }