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