Todas las combinaciones posibles de una matriz 2D [duplicado]

Quiero generar todas las combinaciones posibles a partir de una matriz 2D [mxn] excepto el primer elemento de cada matriz. Ese elemento representará el 'tipo' que significa el resto de elementos. Por ejemplo, si tengo una matriz

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

El resultado deseado debe ser la combinación de todas las posibilidades de la camiseta. Para el ejemplo anterior,

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

Intenté algo como esto (también recibí ayuda de otros Stack Overflow Pregunta )

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;
}

pero da valores de TODAS las n combinaciones solamente, es decir

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

No tiene en cuenta combinaciones más pequeñas y ni siquiera es genérico, es decir, para una matriz [mxn] (no es necesario corregir n). Una ayuda en VBA sería muy apreciada. Me siento cómodo con C, Java y C#. Gracias por adelantado :)

Edit:

Esto es diferente al pregunta hecha aquí. Este no es un producto cartesiano en el que . elemento se tome de cada matriz en cuestión. La salida que requiero no pone esta restricción; por lo tanto, el número de combinaciones en este escenario> número de combinaciones en la pregunta vinculada. Además, la primera columna es un descriptor del contenido y debe acompañar al contenido.

preguntado el 04 de julio de 12 a las 10:07

También sería bienvenido un enlace a una pregunta respondida similar. -

¿No ayudaría simplemente dejar j empezar desde 1 en lugar de 0? -

@Liam hizo la edición de por qué este no es el duplicado:

3 Respuestas

Enlace a la respuesta original

Para dos matrices, dos bucles anidados deberían hacer:

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 más anidamiento, necesitaría una solución recursiva o equivalente basada en pila.

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]);
    }
}

contestado el 23 de mayo de 17 a las 12:05

Funciona bien hasta un límite, es decir, si tengo una matriz 2D de longitud m, produce combinaciones de tamaño m. Lo que necesito son combinaciones de talla 1 a m. Gracias por tomarse el tiempo para responder; proporcionará alguna idea. - slartibartfast

¿Es lo que quieres, un producto 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};

Respondido 04 Jul 12, 10:07

Gracias Dave; el enfoque fue bastante bueno. Funcionó en SQL, pero necesito un enfoque más similar a Java. - slartibartfast

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();
            }
        }

    }
}

Respondido 22 Jul 12, 14:07

¡Eso es simple y genial! Funciona lo suficientemente bien para 3 matrices. - slartibartfast

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.