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).
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, 1 ≤ Ci ≤ 16, el valor o número entero contenidos en esa casilla).******** PRÓXIMO RETO
Reto 5: "Los cuadrados mágicos y el ajedrez (V)".
Reto 5: "Los cuadrados mágicos y el ajedrez (V)".
Comentarios
Publicar un comentario