• 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("
    ");
            *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;
    }
  • 相关阅读:
    js获取数组中的值显示[object HTMLInputElement]
    IntelliJ Idea 常用快捷键
    MySQL查询本周、上周、本月、上个月份数据的sql代码
    表的基本
    字符串类型
    备份数据库
    增加标 和增加其内容
    数据库的基本
    jq做的简单的变色表格
    jq做的简单的轮播
  • 原文地址:https://www.cnblogs.com/zhaohuan1996/p/12814799.html
Copyright © 2020-2023  润新知