【问题标题】:Combinations of elements in an array数组中元素的组合
【发布时间】:2015-05-15 06:41:11
【问题描述】:

我正在尝试编写一个 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

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

另外,如果有比这更好的替代解决方案,请随时分享。

【问题讨论】:

  • 结果(实际的或想要的)都不是 5 个数字中长度为 3 的 所有 组合。您可能应该首先尝试在纸上的不同算法,直到找到满足您要求的算法,然后尝试使用该算法编写程序。
  • 您在寻找原始集合的所有 3 元素子集吗?
  • 是的,类似@martin
  • 结果集中的数字需要按升序顺序排列吗?你真的应该用这样的所有要求更新你的问题。
  • 我不想发布仅链接的答案,但 Rosetta 代码有很多用于此类算法的代码。我想这就是你要找的东西:rosettacode.org/wiki/Combinations#C

标签: c combinations


【解决方案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;
}

【讨论】:

    【解决方案2】:
    #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
    }
    

    抱歉编辑不好..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-15
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多