78.子集

求所有的子集,一下子就想到回溯,回溯有两个模板,一个是组合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("\n");
        *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("\n");
        *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("\n");
        *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\n",rs[0][0]);
    return 0;
}

 

posted @ 2020-05-01 20:58  dreamy_java  阅读(185)  评论(0编辑  收藏  举报