Todas as combinações possíveis de um array 2D

Eu quero gerar todas as combinações possíveis de uma matriz 2D [mxn], exceto para o primeiro elemento de cada matriz. Esse elemento representará o ‘tipo’ significando os elementos de descanso. Por exemplo, se eu tiver uma matriz

shirts[][] = { {"colour", "red", "blue", "green", "yellow"}, {"cloth", "cotton", "poly", "silk"}, {"type", "full", "half"} }; 

A saída desejada deve ser uma combinação de todas as possibilidades de camisa. Para o exemplo acima,

 colour red colour blue ... cloth silk type full type half colour red cloth cotton colour red cloth poly ... colour yellow type half cloth cotton type full ... cloth silk type half colour red cloth cotton type full ... colour yellow cloth silk type half 

Eu tentei algo assim (também recebi ajuda de outra questão de estouro de pilha)

 String shirts[][] = { {"colour", "red", "blue", "green", "yellow"}, {"cloth", "cotton", "poly", "silk"}, {"type", "full", "half"} }; majorCombinations = new int[possibilities][shirts.length]; int currentCombination; int offset = 1; for (int i=0; i < shirts.length; i++) { currentCombination = 0; while (currentCombination < possibilities) { for (int j=0; j < shirts[i].length; j++) { for (int k=0; k < offset; k++) { if (currentCombination < possibilities) { majorCombinations[currentCombination][i] = shirts[i][j]; currentCombination++; } } } } offset *= shirts[i].length; } 

mas dá valores de todas as combinações apenas n ou seja

 colour cloth type colour cloth full ... yellow silk half 

Ele não leva em consideração combinações menores e nem é genérico, isto é, para um array [mxn] (n não precisa ser corrigido). Uma ajuda no VBA seria muito apreciada. Estou confortável com C, Java e C # também. Desde já, obrigado 🙂

Link para a resposta original

Para dois arrays, dois loops nesteds devem fazer:

 for (int i = 0 ; i != c[0].length ; i++) { for (int j = 0 ; j != c[1].length ; j++) { System.out.writeln(""+c[0][i]+c[1][j]); } } 

Para mais aninhamento você precisaria de uma solução baseada em pilha recursiva ou equivalente.

 void combos(int pos, char[][] c, String soFar) { if (pos == c.length) { System.out.writeln(soFar); return; } for (int i = 0 ; i != c[pos].length ; i++) { combos(pos+1, c, soFar + c[pos][i]); } } 

É o que você quer, um produto cartesiano?

 var colours = new[]{"colour - red", "colour - blue", "colour - green", "colour - yellow"}; var cloth = new[] {"cloth - cotton", "cloth - poly", "cloth - silk"}; var type = new[]{"type - full", "type - half"}; var combinations = from c in colours from cl in cloth from t in type select new[]{c, cl, t}; 
 for (int i = 0; i < shirts[0].length; i++) { for (int j = 0; j < shirts[1].length; j++) { for (int k = 0; k < shirts[2].length; k++) { if (i != 0) System.out.print(shirts[0][0] + " " + shirts[0][i] + " "); if (j != 0) System.out.print(shirts[1][0] + " " + shirts[1][j] + " "); if (k != 0) System.out.print(shirts[2][0] + " " + shirts[2][k] + " "); System.out.println(); } } } }