数组中元素的组合

时间:2015-05-15 06:41:11

标签: c combinations

我试图编写一个C程序来查找给定数组和指定长度的所有组合。这是我到目前为止所做的......

#include <stdio.h>

void com(int* a, int* t, int len, int i) {

    int j, k;

    if(len == 0) {

        for(k=0;k<3;k++) {
            printf("%d  ",t[k]);
        }

        printf("\n");
        return;
    }

    for(j = i ; j <= 4-len ; j++) {  // 4 = original array size 
        t[3-len] = a[j];
        com(a,t,len-1,i+1);
    }
}

main() {

    int t[3];
    com((int[]){4,1,3,2},&t[0],3,0); // 3 = combination length
}

此代码中的问题是它没有跳过重复,重复组合的选项。例如,它生成的数组{1,2,3,4}

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

但它应该生成

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

我能为此做些什么?我不知道该怎么做。任何形式的帮助将不胜感激。感谢。

此外,如果有替代方案和更优化的解决方案,请随时分享。

2 个答案:

答案 0 :(得分:1)

要修复的示例

void com(int *a, int *t, int len, int i){
    if(i == len){
        for(int k = 0; k < len; k++)
            printf("%d ", t[k]);
        printf("\n");
        return;
    }
    while(*a){
        t[i] = *a;
        com(++a, t, len, i+1);
    }
}

int main(void){
    int t[3];

    com((int[]){1,2,3,4, 0}, t, 3, 0);
    //                   ^end mark
    return 0;
}

答案 1 :(得分:1)

#include <stdio.h>


int check(int *t)
{
  int j,k;

    for(k=0;k<3;k++)
    {
              for(j=k+1;j<3;j++)
              {
                   if(t[k]==t[j])
                   return 0;
               }
    }
  return 1;
}

 void com(int* a, int* t, int len, int i) {

    int j, k;
    int comb=1;


    if(len == 0)
    {


     comb = check(t);

     if(comb)
      {

       for(k=0;k<3;k++) 
          {
            printf("%d  ",t[k]);
          }

        printf("\n");
       }
        return;

     }

    for(j = i ; j <= 4-len ; j++) {  // 4 = original array size

    t[3-len] = a[j];
    com(a,t,len-1,i+1);
    }
}

main() {

int t[3];
com((int[]){4,1,3,2},&t[0],3,0); // 3 = combination length
}

抱歉编辑错误..