Quantcast
Channel: El blog de García Larragan y Cía
Viewing all articles
Browse latest Browse all 639

Cuadrados mágicos (IV): Solución Reto 4

$
0
0

Solución al cuarto reto sobre cuadrados mágicos y ajedrez que he puesto recientemente en este blog, y en el que también se ve involucrada la programación.

El enunciado del reto decía lo siguiente: En el reto anterior se pedía construir un cuadrado mágico de orden 4, 4 filas y cuatro columnas, normal (que contenga todos los números naturales desde el 1 hasta n2, en este caso del 1 al 16) y en el que se "escondan" todas las posibles soluciones al problema de las 4 reinas, es decir, que la suma de las casillas del cuadrado donde se ubicarían las 4 reinas de cada solución dé como resultado su constante mágica, n(n2+1)/2 = 4(17)/2=34, y en la solución a dicho reto decía que hay muchos cuadrados mágicos que cumplen esos requisitos. ¿Sabrías decirme: cuántos y cuáles?.

Solución: Evidentemente, lo primero que hay que hacer es averiguar cuántos cuadrados mágicos de orden 4 normales hay y cuáles son éstos, con objeto de poder examinar cada uno de ellos y comprobar así en cuáles se "esconden" las dos posibles soluciones al problema de las 4 reinas.

Pues bien, voy a aprovecharme del trabajo del matemático francés Bernard Frénicle de Bessy que, allá por el siglo XVII, estableció 880 cuadrados mágicos de orden 4 normales como esencialmente diferentes. Por tanto, parto del pequeño fichero (cuadrados_mágicos_normales_4x4_esenciales.txt) que dejé como recurso asociado al reto en la primera pista que puse para ayudar a resolverlo y que contiene los 880 cuadrados mágicos citados anteriormente.

Antes que nada, indicar que por cada uno de los cuadrados mágicos esenciales contenidos en ese fichero hay otros 7 que no han merecido esa consideración y que se obtienen de los primeros a partir de rotaciones o simetrías (reflejos); aquellos que son resultado de:

1.- Rotación de 90º del cuadrado mágico esencial.

2.- Rotación de 180º del cuadrado mágico esencial.

3.- Rotación de 270º del cuadrado mágico esencial.

4.- Reflejo horizontal (doblado del cuadrado mágico esencial por su eje central vertical).

5.- Reflejo vertical (doblado del cuadrado mágico esencial por su eje central horizontal).

6.- Reflejo primera diagonal principal (doblado del cuadrado mágico esencial por la diagonal principal que va de izquierda a derecha).

7.- Reflejo segunda  diagonal principal (doblado del cuadrado mágico esencial por la diagonal principal que va de derecha a izquierda).

Por lo que entiendo que en total hay 880 x 8 = 7.040 cuadrados mágicos de orden 4 normales.

Ahora, sólo queda saber cuántos y cuáles de esos 7.040 cuadrados "esconden" las dos posibles soluciones al problema de las 4 reinas.

Para ello, creo un pequeño script en python:

def suma_casillas_soluciones_34(casilla0,casilla1,casilla2,casilla3,
                                                 casilla4,casilla5,casilla6,casilla7,
                                                 casilla8,casilla9,casilla10,casilla11,
                                                 casilla12,casilla13,casilla14,casilla15):
#---------------------------------------------------------------------------------------------------
# Comprueba si el resultado de la suma de las casillas de las dos soluciones es igual a la
# constante mágica (34).
#---------------------------------------------------------------------------------------------------
#
    suma_Damas_1=int(casilla2)+int(casilla4)+int(casilla11)+int(casilla13)
    suma_Damas_2=int(casilla1)+int(casilla7)+int(casilla8)+int(casilla14)
    if suma_Damas_1== 34 and suma_Damas_2== 34:
        print('[+]',casilla0,casilla1,casilla2,casilla3,
                        casilla4,casilla5,casilla6,casilla7,
                        casilla8,casilla9,casilla10,casilla11,
                        casilla12,casilla13,casilla14,casilla15,
                       '--> Suma casillas Damas ambas soluciones = 34')
        return True
    else:
        return False
#
#=========================================================
# A partir del fichero con los cuadrados mágicos normales de 4x4 esenciales (880),
# calcula la suma de las 4 casillas de cada uno de ellos y de los generados a partir de los mismos
# donde se colocarían las Damas de cada una de las dos soluciones al problema de la 4 reinas,
# para averiguar en cuáles el resultado de ambas sumas es igual a la constante mágica (34).
#=========================================================
#
f_cuadrados_mágicos_normales_4x4 = open("cuadrados_mágicos_normales_4x4_esenciales.txt")

e=0
o=0
es=0
os=0
print('')
print('*** Búsqueda de cuadrados mágicos cuya suma de las casillas de ambas soluciones es 34:')
for cuadrado_magico in f_cuadrados_mágicos_normales_4x4:
#---------------------------------------------------------------------------------------------------
# Cuadrado mágico, normal, 4x4 y designado como esencial.
#---------------------------------------------------------------------------------------------------
#
    e+=1
    casilla=cuadrado_magico.split()
    if suma_casillas_soluciones_34(casilla[0],casilla[1],casilla[2],casilla[3],
                                                  casilla[4],casilla[5],casilla[6],casilla[7],
                                                  casilla[8],casilla[9],casilla[10],casilla[11],
                                                  casilla[12],casilla[13],casilla[14],casilla[15]):
       es+=1
#---------------------------------------------------------------------------------------------------
# Rotación de 90º del cuadrado mágico esencial.
#---------------------------------------------------------------------------------------------------
#
    o+=1
    if suma_casillas_soluciones_34(casilla[12],casilla[8],casilla[4],casilla[0],
                                                  casilla[13],casilla[9],casilla[5],casilla[1],
                                                  casilla[14],casilla[10],casilla[6],casilla[2],
                                                  casilla[15],casilla[11],casilla[7],casilla[3]):
        os+=1
#---------------------------------------------------------------------------------------------------
# Rotación de 180º del cuadrado mágico esencial.
#---------------------------------------------------------------------------------------------------
#
    o+=1
    if suma_casillas_soluciones_34(casilla[15],casilla[14],casilla[13],casilla[12],
                                                  casilla[11],casilla[10],casilla[9],casilla[8],
                                                  casilla[7],casilla[6],casilla[5],casilla[4],
                                                  casilla[3],casilla[2],casilla[1],casilla[0]):
        os+=1
#---------------------------------------------------------------------------------------------------
# Rotación de 270º del cuadrado mágico esencial.
#---------------------------------------------------------------------------------------------------
#
    o+=1
    if suma_casillas_soluciones_34(casilla[3],casilla[7],casilla[11],casilla[15],
                                                  casilla[2],casilla[6],casilla[10],casilla[14],
                                                  casilla[1],casilla[5],casilla[9],casilla[13],
                                                  casilla[0],casilla[4],casilla[8],casilla[12]):
        os+=1
#---------------------------------------------------------------------------------------------------
# Reflejo horizontal del cuadrado mágico esencial (doblar por el eje vertical).
#---------------------------------------------------------------------------------------------------
#
    o+=1
    if suma_casillas_soluciones_34(casilla[3],casilla[2],casilla[1],casilla[0],
                                                  casilla[7],casilla[6],casilla[5],casilla[4],
                                                  casilla[11],casilla[10],casilla[9],casilla[8],
                                                  casilla[15],casilla[14],casilla[13],casilla[12]):
        os+=1
#---------------------------------------------------------------------------------------------------
# Reflejo vertical del cuadrado mágico esencial (doblar por el eje horizontal).
#---------------------------------------------------------------------------------------------------
#
    o+=1
    if suma_casillas_soluciones_34(casilla[12],casilla[13],casilla[14],casilla[15],
                                                  casilla[8],casilla[9],casilla[10],casilla[11],
                                                  casilla[4],casilla[5],casilla[6],casilla[7],
                                                  casilla[0],casilla[1],casilla[2],casilla[3]):
        os+=1
#---------------------------------------------------------------------------------------------------
# Reflejo primera diagonal principal del cuadrado mágico esencial (doblar por diagonal izq.)
#---------------------------------------------------------------------------------------------------
#
    o+=1
    if suma_casillas_soluciones_34(casilla[0],casilla[4],casilla[8],casilla[12],
                                                  casilla[1],casilla[5],casilla[9],casilla[13],
                                                  casilla[2],casilla[6],casilla[10],casilla[14],
                                                  casilla[3],casilla[7],casilla[11],casilla[15]):
        os+=1
#---------------------------------------------------------------------------------------------------
# Reflejo segunda diagonal principal del cuadrado mágico esencial (doblar por diagonal dcha.)
#---------------------------------------------------------------------------------------------------
#
    o+=1
    if suma_casillas_soluciones_34(casilla[15],casilla[11],casilla[7],casilla[3],
                                                  casilla[14],casilla[10],casilla[6],casilla[2],
                                                  casilla[13],casilla[9],casilla[5],casilla[1],
                                                  casilla[12],casilla[8],casilla[4],casilla[0]):
        os+=1
print('--- Nº cuadrados mágicos esenciales examinados:',e)
print('--- Nº cuadrados mágicos esenciales cuya suma casillas ambas soluciones es 34:',es)
print('--- Nº cuadrados mágicos generados a partir de esenciales examinados:',o)
print('--- Nº cuadrados mágicos a partir de esenciales cuya suma casillas ambas soluciones es 34:',os)
print('*** Total de cuadrados mágicos examinados',e+o)
print('*** Total de cuadrados mágicos cuya suma casillas ambas soluciones es 34:',es+os)

f_cuadrados_mágicos_normales_4x4.close()

Lo ejecuto:
Y tal y como se puede observar en la figura anterior, la respuesta a la pregunta que se plantea en este reto es que las dos soluciones al problema de las 4 reinas se "esconden" en un total 1.152 cuadrados mágicos de orden 4 normales (en 144 esenciales y en 1.008 de los generados a partir de éstos), y todos ellos se muestran, tras la ejecución de este script, con el valor Ci del correspondiente vector (cada índice, 1  i  16, representa una casilla del cuadrado - de izquierda a derecha y de arriba a abajo - y el valor,  C  16, el valor o número entero contenidos en esa casilla).

******** PRÓXIMO RETO
Reto 5:   "Los cuadrados mágicos y el ajedrez (V)".

Viewing all articles
Browse latest Browse all 639

Trending Articles