2017-09-04 89 views
-1

考虑具有三个阵列的情况下:如何从数组中生成组合?

X = {A , B , C}; 
Y = {D , E , F}; 
Z = {G , H , I}; 

如何生成从这些三个阵列的所有可能的组合(C++或Python),即就像

C1 = {A , D , G}; 
C2 = {A , D , H}; 
... 
C4 = {A, E , G}; 
... 
C10 = {B , D , G}; 
... 
... 
+0

我认为你正在寻找笛卡尔乘积。看这里.https://stackoverflow.com/questions/533905/get-the-cartesian-product-of-a-series-of-lists – Tico

+0

@Tico谢谢这正是我正在寻找..如果有一个C++的实现它也会很棒。 –

+0

@Julien谢谢这正是我所期待的。如果有一个C++的实现,它也会很棒。 –

回答

2

尝试此

from itertools import product 

x = {'a', 'b', 'c'} 
y = {'d', 'e', 'f'} 
z = {'g', 'h', 'i'} 

for a in product(x, y, z): 
    print(a) 

如果您想要更加务实,从多个集合中获取所有组合可以通过嵌套循环完成。在蟒蛇,它会是这样

for e1 in x: 
    for e2 in y: 
     for e3 in z: 
      print((e1, e2, e3)) 

如果你不事先知道有多少iterables存在,你可以让他们追加到一个列表中的程序运行,然后运行product(*args),例如

items = [x, y] 
items.append(z) 
for a in product(*items): 
    print(a) 
+0

如果我在运行时间之前不知道输入数组会怎么样? –

+0

我的意思是我不知道我将与多少个阵列合作 –

0

您可以在STL内部使用算法头,使用next_permutation函数可以生成所有可能的组合。警告:它只会产生一个排列,您将不得不在循环中使用它。你可以在这个链接上看到该功能的文档。 Generating Permutation

0

“组合”功能递归地工作以找到答案。只要把所有的元素称为“ARR”一个数组,我认为有6大小下面是山楂的例子使用的功能:

#include <iostream> 
#include <vector> 
using namespace std; 


void combinations(string arr[], int len, int startPosition, string result[]){ 
    if (len == 0){ 
     cout <<"{"; 
     for (int i = 0; i < 2; i++) { 
      cout << result[i] <<", "; 
     } 
     cout << result[2]+ "}" << endl; 
     return; 
    } 

    for (int i = startPosition; i <= 6-len; i++){ 
     result[3 - len] = arr[i]; 
     combinations(arr, len-1, i+1, result); 
    } 
} 

int main(int argc, const char * argv[]) { 

    string arr[] = {"A","B","C","D","E","F"}; 
    string temp[3]; 
    combinations(arr, 3, 0, temp); 

}