Mi programa produce dibujos en blanco y negro. Empieza así:
BBBN
BBNB
BNBB
NBBB
No viene al caso por qué. Cada letra representa el color de uno de sus cuadraditos.
Va pintando desde abajo hacia la izquierda, haciendo todas las combinaciones posibles:
BBBN
BBNB
BNBB
NBBN
luego:
BBBN
BBNB
BNBB
NBNB
luego:
BBBN
BBNB
BNBB
NBNN
etc.
Según lo entiendo, el 1er simétrico que debe captar es:
BNBB
BBBB
BBBB
BBBB
es simétrico a:
BBNB
BBBB
BBBB
BBBB
Simétrico se refiere a que si se invierte cada fila, el dibujo queda como alguno anterior, ya producido. Ese de abajo se produjo antes que el de arriba.
Según eso, un dibujo puede ser simétrico desde que se pinta el cuadradito de arriba, anterior al medio, es:
Math.floor(CuadraditosPorFila/2);
En este caso, como hay 4 cuadraditos por fila, va a ser 4/2, que da 2.
¿Pero cómo indico a la PC cuando es anterior y cuando no? Pensé que debí invertir cada fila y si la inversión era igual entonces era simétrico, pero eso es otra cosa. Por ejemplo:
NBBN
BBBB
BBBB
BBBB
visto al revés (las filas) es igual, pero ese dibujo, al derecho o al revés, no se produjo antes.
Lo que se me ocurre tiene que ver con cómo puede ser descrito con números el dibujo, pero no sé la solución detallada y busco una más simple. Por ejemplo este dibujo:
BNBB
BNBN
BBBB
BBBB
que por cierto, visto al revés no es igual, pero ya fue producido su contrario, puede ser descrito como:
0100010100000000
si al invertir cada fila, el número es menor:
0010101000000000
entonces el dibujo ya fue producido.
No sé si funciona. ¿Qué me recomiendan?
Aquí tienen un video, no presten atención a lo de aislados y pequeños, sólo tengan en cuenta que si un dibujo es considerado aislado o pequeño no será considerado simétrico, ni Ok. Igual como dije mi contador de simétricos está mal. Así es ese contador:
// ¿El dibujo es simétrico a otro ya mostrado?
// Esto puede que cambie:
DibujoEsSimetrico = "No";
if (SimetriaPosible == "Sí") {
// Se captarán los colores de cada fila y al revés:
// Si son distintos, ya no, el dibujo no es simétrico.
Fila = 0;
// Para captar de una nueva fila:
do {
ColoresDeFila = "";
InversionDeFila = "";
Fila++;
Columna = 0;
ColumnaInversa = CuadraditosPorFila+1;
// Captar nueva fila:
do {
Columna++;
CuadraditoaCaptar = (Fila-1)*CuadraditosPorFila+Columna;
ColoresDeFila = ColoresDeFila+eval("ColordeCuadradito"+CuadraditoaCaptar);
ColumnaInversa--;
InversoaCaptar = (Fila-1)*CuadraditosPorFila+ColumnaInversa;
InversionDeFila = InversionDeFila+eval("ColordeCuadradito"+InversoaCaptar);
} while (Columna<HastaColumna);
// ¿Los colores en las filas son simétricos?
trace ("ColoresDeFila: "+ColoresDeFila);
trace ("InversionDeFila: "+InversionDeFila);
if (ColoresDeFila != InversionDeFila) {
// DibujoesSimetrico = "No";
// Terminar el análisis:
Fila = CuadraditosPorFila;
}
} while (Fila<CuadraditosPorFila);
if (ColoresDeFila == InversionDeFila) {
DibujoEsSimetrico = "Sí";
// trace (" El dibujo es simétrico a otro ya mostrado.");
DibujosSimetricos++;
// Preparar Puntero para generar el próximo dibujo:
Puntero = MaxPosiciondePuntero;
Variar();
}Está mal.
El video: