美文网首页
全排列&子集的生成

全排列&子集的生成

作者: 空白少侠 | 来源:发表于2017-02-21 18:15 被阅读96次

全排列

生成 1 ~ n 的全排列


#include<stdio.h>
#define bool int
#define false 0
#define true 1
#define N 5
void dfs(int index,int *visit,int n,int *num){//index表示num的下角标
    if(index == n ){
        for (int i = 0; i<n; i++)  printf("%d ",num[i]);
        printf("\n");
        return ;
    }
    for(int i = 1 ; i <=n ; i ++){  //i 的范围大小 表示num的数字由哪些数字组成
        if(!visit[i]){//判断数字是否被用  判断的方法是根据visit的元素下角来看的若角标对应的值是1 则这个数字被使用 就判断下一数字
            visit[i] = true;//若没被使用  先标志记录下这个数字,
            num[index] = i;//把这个数字填到num对应角标去进去;
            dfs(index+1,visit,n,num);//下一位
            visit[i] = false;//将该数字使用完置为0
        }
    }
}

int main(){
    int num[100];
    bool visit[100];   //用来记录数字是否使用过
    dfs(0,visit,N,num);//递归存最后一位开始循环所有排列可能 ,逐位向前推进
    return 0;
}

输出:

1 2 3 4 
1 2 4 3 
1 3 2 4 
1 3 4 2 
1 4 2 3 
1 4 3 2 
2 1 3 4 
2 1 4 3 
2 3 1 4 
2 3 4 1 
2 4 1 3 
2 4 3 1 
3 1 2 4 
3 1 4 2 
3 2 1 4 
3 2 4 1 
3 4 1 2 
3 4 2 1 
4 1 2 3 
4 1 3 2 
4 2 1 3 
4 2 3 1 
4 3 1 2 
4 3 2 1 

断点打在这里



index == 0




index==1

数字被使用后会被记录,避免了重复以此类推

子集的生成

生成{1,2,3,.......n}的子集

  • 位向量法
    构造一个位向量 have[i] .
    表示集合{0,1,3,4,6}
#include "stdio.h"
#define N 5
int have[N] = {0};
int num[N];
void f(int cur,int n){//cur表示位数
    if(cur == n){
        for (int i = 0; i <= cur; i++) {
            if(have[i]){
                printf("%d ",i);
            }
        }
        printf("\n");
        return;
    }
    have[cur] = 0;//不选cur个元素
    f(cur+1, n);
    have[cur] = 1;//选cur个元素
    f(cur+1, n);
}

int main(){
    f(1,N+1);
    return 0;

}

  • 二进制法
    移位运算
#include<stdio.h>
void binary(int n, int s) {
    for(int i = 0; i < n; i++){
        if(s & ( 1<<i) ) //1左移i位,监测s的哪一位为1,同或为1的话输出
            printf("%d ", i+1);
    }
    printf("\n");
}
int main()   {
    int n = 2;
    for(int i = 0; i < (1<<n); i++){  //循环 2^n-1次 因为 1 左位移n次  相当于 循环2^n - 1
            binary(n, i);
    }
    return 0;  
}

相关文章

  • 全排列&子集的生成

    全排列 生成 1 ~ n 的全排列 输出: 断点打在这里 index == 0 数字被使用后会被记录,避免了重复以...

  • 《算法竞赛入门经典》第七章学习笔记

    枚举排列 生成1~n的排列 生成可重集的排列 利用STL生成排列 子集生成 增量构造法 位向量法 二进制法

  • 子集、全排列、第k个排列

    子集输出 全排列输出 存在重复数字的全排列 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。 按大...

  • 回溯一:全排列、子集

    46. 全排列[https://leetcode-cn.com/problems/permutations/]47...

  • 搜索(二)回溯

    一、题目总结 基础问题 46.全排列 77.组合 78.子集 39.组合求和 47.全排列 II(重复元素) 90...

  • 按照字典序生成全排列

    说到排列,肯定先想到生成排列,这一节讲如何按照字典序法生成数字的全排列或者某一排列的下一排列。 原理如上,给个题目...

  • python数独的几个核心计算函数

    1.生成A9排列矩阵 1到9,9个数字的全排列可以说是数独的基础,根据统计学可以计算出9个数字的全排列是36288...

  • 2022-12-01

    结构起伏 在液态金属中微小的范围内,存在着紧密接触、规则排列的原子集团,称为短程有序。这些紧密规则排列的原子集团并...

  • R语言-列表

    生成列表list函数 取一个子集 取子集的子集 转换为列表及解除列表 列表的转换

  • 子集、组合、排列算法

    列出所有 1...n 的子集 输出 从 1...n 选 m 个数,列出所有组合 输出 从 1...n 选 m 个数...

网友评论

      本文标题:全排列&子集的生成

      本文链接:https://www.haomeiwen.com/subject/snvuwttx.html