C 集合的组合';元件(不包括一套)

C 集合的组合';元件(不包括一套),c,matrix,set,combinations,C,Matrix,Set,Combinations,假设我有四套: set1 = {A, a} set2 = {B, b} set3 = {C, c} set4 = {D, d} 现在我需要它们元素的所有唯一组合(无论以何种顺序),但不包括其中一个集合。例如,不考虑set4,我需要以下组合: ABC AbC ABc Abc aBC abC aBc abc uint8_t excluded = 3; // index of the column which has to be excluded for (i = 0; i < 4; i+

假设我有四套:

set1 = {A, a}
set2 = {B, b}
set3 = {C, c}
set4 = {D, d}
现在我需要它们元素的所有唯一组合(无论以何种顺序),但不包括其中一个集合。例如,不考虑set4,我需要以下组合:

ABC
AbC
ABc
Abc
aBC
abC
aBc
abc
uint8_t excluded = 3; // index of the column which has to be excluded

for (i = 0; i < 4; i++) {
    if (i != excluded) {
        for (x = 0; x < 2; x++) {
            for (j = i + 1; j < 4; j++) {
                if (j != excluded) {
                    for (t = 0; t < 2; t++) {
                        for (k = j + 1; k < 4; k++) {
                            if (k != excluded) {
                                for (z = 0; z < 2; z++) {
                                    printf("%c %c %c\n",
                                        matrix_calc[x][i],
                                        matrix_calc[t][j],
                                        matrix_calc[z][k]);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
我已经尝试将集合安排为矩阵:

char matrix_calc[2][4] = {
        {'A', 'B', 'C', 'D'},
        {'a', 'b', 'c', 'd'},
};
我写这段代码是为了找到这些组合:

ABC
AbC
ABc
Abc
aBC
abC
aBc
abc
uint8_t excluded = 3; // index of the column which has to be excluded

for (i = 0; i < 4; i++) {
    if (i != excluded) {
        for (x = 0; x < 2; x++) {
            for (j = i + 1; j < 4; j++) {
                if (j != excluded) {
                    for (t = 0; t < 2; t++) {
                        for (k = j + 1; k < 4; k++) {
                            if (k != excluded) {
                                for (z = 0; z < 2; z++) {
                                    printf("%c %c %c\n",
                                        matrix_calc[x][i],
                                        matrix_calc[t][j],
                                        matrix_calc[z][k]);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
uint8不包括=3;//必须排除的列的索引
对于(i=0;i<4;i++){
如果(i!=排除){
对于(x=0;x<2;x++){
对于(j=i+1;j<4;j++){
如果(j!=不包括在内){
对于(t=0;t<2;t++){
对于(k=j+1;k<4;k++){
如果(k!=排除){
对于(z=0;z<2;z++){
printf(“%c%c%c\n”,
矩阵计算[x][i],
矩阵计算[t][j],
矩阵_计算[z][k];
}
}
}
}
}
}
}
}
}
代码可以工作,但它不灵活,而且似乎很昂贵(就速度而言)。例如,如果集合的数量增加,我必须大量更改代码(并且我将迷失在额外的For循环中)

例如,如果我有5套而不是4套,我有以下代码:

for (i = 0; i < 5; i++) {
    if (i != excluded) {
        for (x = 0; x < 2; x++) {
            for (j = i + 1; j < 5; j++) {
                if (j != excluded) {
                    for (t = 0; t < 2; t++) {
                        for (k = j + 1; k < 5; k++) {
                            if (k != excluded) {
                                for (z = 0; z < 2; z++) {
                                    for (m = k + 1; m < 5; m++) {
                                        if (m != excluded) {
                                            for (w = 0; w < 2; w++) {
                                                printf("%c %c %c %c\n",
                                                        matrix_calc[x][i],
                                                        matrix_calc[t][j],
                                                        matrix_calc[z][k],
                                                        matrix_calc[w][m]);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
(i=0;i<5;i++)的
{
如果(i!=排除){
对于(x=0;x<2;x++){
对于(j=i+1;j<5;j++){
如果(j!=不包括在内){
对于(t=0;t<2;t++){
对于(k=j+1;k<5;k++){
如果(k!=排除){
对于(z=0;z<2;z++){
对于(m=k+1;m<5;m++){
如果(m!=已排除){
对于(w=0;w<2;w++){
printf(“%c%c%c%c\n”,
矩阵计算[x][i],
矩阵计算[t][j],
矩阵计算[z][k],
矩阵计算[w][m];
}
}
}
}
}
}
}
}
}
}
}
}

是否有一种更有效(更干净)的方法?

可能更适合codereview。这也是你在那里遇到的很多问题。阅读这里:你遇到的是一个排列问题。有几种较小的算法非常适合那些半统计业务,我相信现场有几个很好的例子。。