C语言算法—(生成数字的组合升级)生成数据的全排列(类似建立树的回溯法)

来源:互联网 发布:highcharts ajax json 编辑:程序博客网 时间:2024/06/08 12:43

其实我们可以看到,在上一个算法(生成数字的组合)中,生成的数据中包含了已知数据的全排列在其中了;
这里写图片描述

所以我们可以对上一个程序生成的数据进行一次筛选就可以得到全排列;

首先,给出上一个算法(生成数字的组合)的链接:
生成数字组合

在上图中,我们可以看到属于全排列的组合和普通组合的差别在于全排列组合中的数据没有重复项,这样,就非常简单了;

我们只需要将top组合进行一次筛选,筛选出在top数组中没有重复项的即可;

#include<stdio.h>#include<malloc.h>int N;bool judge(int *tag){    for(int i=0;i<N;++i)    for(int j=i+1;j<N;++j)    {        if(tag[i]==tag[j]) return 0;    }    return 1;}void build(int *a,int *tag,int n){    if(n==N)    {        int c[N];        for(int i=0;i<N;++i)        c[i]=tag[i];        int ci;        ci=judge(c);        if(ci)        {            printf("{");            for(int i=0;i<N;++i)            printf("%d",a[tag[i]]);            printf("}");            printf("\n");        }        return ;    }    for(int i=0;i<N;++i)    {        tag[n]=i;        build(a,tag,n+1);    }}int main(){    scanf("%d",&N);    int *a=(int *)malloc(sizeof(int)*N);    for(int i=0;i<N;++i)    scanf("%d",&a[i]);    int tag[N];    build(a,tag,0);    return 0;}
0 0