生成表格中的所有元素组合(语言C)

时间:2017-12-07 14:16:57

标签: c codeblocks apriori

我有一个整数表

int Table[]={1,2,3,....,28};

我想要这个组合:

1 2 3 4 5 6 7 ... 28 

之后我会有这个

12 13 14 15 16 17 18 19 23 24 24 ..... 

直到所有组合都可以不重复(i.e 12=21)

我想要像excel列中那样组合,例如

char alp[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P'
,'Q','R','S','T','U','V','W','X','Y','Z'};

2 个答案:

答案 0 :(得分:0)

这个问题可以这样解决:

#include <stdio.h>

void swp(char* array, int index_1, int index_2)
{
    char tmp = array[index_1];
    array[index_1] = array[index_2];
    array[index_2] = tmp;
}

void perm(char* array, int start, int end)
{
    if (start == end)
        printf("%s\n", array);
    else
    {
        for (int i = start; i <= end; i++)
        {
            swp(array, start, i);
            perm(array, start + 1, end);
            swp(array, start, i);
        }
    }
}

void main(void)
{
    char s[] = "Banana";
    perm(s, 0, 5);
}

我们基本上从使用其他元素交换第一个元素开始,我们使用循环,因此我们在第一次交换中可以做的每个选择最终都会被计算出来。 当我们进行一次迭代时,比如说在第一次迭代中用自己交换第一个元素,我们递归地调用perm()并继续执行该决定,在我们从递归返回之后我们必须撤消交换,以便未触及的数组可以继续迭代。

答案 1 :(得分:0)

将递归交换元素与所有可能的后续元素一起使用:

#include <stdio.h>

void swap(int* array, int i, int j)
{
    int temp = array[i];
    array[i] = array[j];
    array[j] = temp;
}

void print_array(int *array, int len)
{
    int i;
    for (i = 0; i<len; i++ )
    {
         printf("%c ", array[i]);
    };
    printf("\n");   
}

void permute(int *array, int start, int len)
{
    int i;
    if(start == len)
    {
        print_array(array, len);
        return;
    }

    permute(array, start + 1, len);

    for(i = start + 1; i < len; i++)
    {
        if(array[start] == array[i])
            continue;

        swap(array, start, i);

        permute(array, start + 1, len);
        swap(array, start, i);
    }
}

int main()
{
    // for 4 elements:
    int perm[] = {'A','B','C','D'};
    int number_of_elements = 4;

    permute(perm, 0, number_of_elements);

    return 0;
}

输出:

A B C D 
A B D C 
A C B D 
A C D B 
A D C B 
A D B C 
B A C D 
B A D C 
B C A D 
B C D A 
B D C A 
B D A C 
C B A D 
C B D A 
C A B D 
C A D B 
C D A B 
C D B A 
D B C A 
D B A C 
D C B A 
D C A B 
D A C B 
D A B C