Ejemplo:
Citar
A B C D
Siendo A string[0], y D string[3] resultados:
Citar
0 1 2 3
1 0 2 3
1 2 0 3
1 2 3 0
0 2 3 1
2 0 3 1
2 3 0 1
2 3 1 0
0 3 1 2
3 0 1 2
3 1 0 2
3 1 2 0
0 1 2 3
1 0 2 3
1 2 0 3
1 2 3 0
0 2 3 1
2 0 3 1
2 3 0 1
2 3 1 0
0 3 1 2
3 0 1 2
3 1 0 2
3 1 2 0
1 0 2 3
1 2 0 3
1 2 3 0
0 2 3 1
2 0 3 1
2 3 0 1
2 3 1 0
0 3 1 2
3 0 1 2
3 1 0 2
3 1 2 0
0 1 2 3
1 0 2 3
1 2 0 3
1 2 3 0
0 2 3 1
2 0 3 1
2 3 0 1
2 3 1 0
0 3 1 2
3 0 1 2
3 1 0 2
3 1 2 0
Principalmente intenté entender como funcionaba y como podría conseguir una pauta de sacar todas combinaciones, aquí ya hablare de todo el lío que se me pasó por la cabeza, al principio probé exclusivamente con 3 elementos, A, B, C la idea principal era sacar las 6 posibles combinaciones mediante una pauta a seguir, la idea era cambiar A dónde B, B dónde A generando una nueva palabra, después B dónde C, y C dónde B generando otra nueva palabra, y vuelta empezar hasta sacar las 6 combinaciones, el problema vino con elementos de cuatro, aquí empece a volverme loco al principió pensé que sería A dónde B, B dónde A. generando una nueva palabra, y después C dónde D y D dónde C generando otra nueva palabra y así sucesivamente, pero tras sacar 8 palabras nuevas, empezaban todas a repetirse, unas de las opciones que opté fue organizarlas por de menor a mayor
De la siguiente forma:
Citar
0 1 2 3
0 1 3 2
0 2 1 3
0 2 3 1
0 3 1 2
0 3 2 1
1 0 2 3
1 0 3 2
1 2 0 3
1 2 3 0
1 3 0 2
1 3 2 0
2 0 1 3
2 0 3 1
2 1 0 3
2 1 3 0
2 3 0 1
2 3 1 0
3 0 1 2
3 0 2 1
3 1 0 2
3 1 2 0
3 2 0 1
3 2 1 0
0 1 3 2
0 2 1 3
0 2 3 1
0 3 1 2
0 3 2 1
1 0 2 3
1 0 3 2
1 2 0 3
1 2 3 0
1 3 0 2
1 3 2 0
2 0 1 3
2 0 3 1
2 1 0 3
2 1 3 0
2 3 0 1
2 3 1 0
3 0 1 2
3 0 2 1
3 1 0 2
3 1 2 0
3 2 0 1
3 2 1 0
La idea ahora era que a la hora de programarlo, solo tuviese que tener en cuenta el código ASCII de los caracteres que componían la palabra e ir ordenándolos de menor a mayor, pero no vi como y me pareció una perdida de tiempo.
Finalmente me percaté (cielos, esto parece una novela xD) de qué la pauta que seguía independientemente de los elementos que cogiesen era A dónde B (Generando así nueva palabra) después B dónde C (Generando de nuevo otra nueva palabra) C dónde D (Generando, cómo no, una nueva palabra) y finalmente D dónde A y vuelta a empezar.
Si, efectivamente me encanta enrollarme pero quiero hacerme entender, llegados a este punto mi idea es la siguiente...
n! siendo n el tamaño del string, para después crear una tupla con el resultado de n! para recorrer un for n! veces y rellenar toda la tupla con las posibles combinaciones. El problema está en que no sé como narices puedo pasar String[0] por String[1] en la siguiente vuelta String[1] por String[2] y así sucesivamente hasta terminar con String[ejemplo.size-1] por String[ejemplo.size]
Código
#include <iostream> #include <string> using namespace std; int main(){ string palabra = "ABC"; int tam = palabra.size(); int i, n_fact = 1; for(i=1; i<=tam; i++){ n_fact = n_fact * i; } string tabla[n_fact]; for (int it = 0; it < n_fact; it++){ // Totalmente perdido en esta parte como indiqué... cout << tabla[it] << endl; } }