Ejercicio: 3Eva2003TI_T2 Verificar un cuadrado mágico
El problema se separa en sus partes principales.
Primero se revisa el número de veces que aparece cada número en el cuadrado. Luego se suma cada fila y columna, guardando los resultados en vectores.
La suma de las diagonales se las hace aparte pues solo se necesita mover un índice; la diagonal principal tiene el mismo índice en la fila y columna; y la diagonal segunda, en cambio la columna es decreciente.
Se validan los resultados parciales con las condiciones para que sea mágico y se muestra el resultado.
Algoritmo en Python
# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 3Eva_IT2003_T2 Verificar un cuadrado mágico
# Propuesta: edelros@espol.edu.ec
import numpy as np
# INGRESO
n = int(input("tamaño cuadrado: "))
while (n>10):
n = int(input("tamaño cuadrado(n<10): "))
cuadrado = np.zeros(shape=(n,n),dtype=int)
for i in range(0,n,1):
for j in range(0,n,1):
cuadrado[i,j] = input("cuadrado ["+str(i+1)+","+str(j+1)+"]: ")
# PROCEDIMIENTO
# verifica numeros repetidos
m = n*n
repetido = np.zeros(m+1,dtype=int)
masdeuno = 0
for i in range(0,n,1):
for j in range(0,n,1):
k = cuadrado[i,j]
repetido[k]=repetido[k]+1
if (repetido[k]>1):
masdeuno = k
#suma de filas y columnas
sfila = np.zeros(n,dtype=int)
scolumna = np.zeros(n,dtype=int)
for i in range(0,n,1):
for j in range(0,n,1):
sfila[i] = sfila[i] + cuadrado[i,j]
scolumna[i] = scolumna[i] + cuadrado[j,i]
# Suma diagonales
sdiagonal = 0
sdiagonal2 = 0
for i in range(0,n,1):
sdiagonal = sdiagonal + cuadrado[i,i]
sdiagonal2 = sdiagonal2 + cuadrado[i,n-1-i]
# verifica condiciones magico
magico = 1
if (masdeuno>0):
magico = 0
if not(sdiagonal==sdiagonal2):
magico = 0
for i in range(0,n,1):
if not(sdiagonal==sfila[i]):
magico = 0
if not(sdiagonal==scolumna[i]):
magico = 0
# SALIDA
print("El resultado es:")
print(magico)
resultado del algoritmo
tamaño cuadrado: 3
cuadrado [1,1]: 4
cuadrado [1,2]: 9
cuadrado [1,3]: 2
cuadrado [2,1]: 3
cuadrado [2,2]: 5
cuadrado [2,3]: 7
cuadrado [3,1]: 8
cuadrado [3,2]: 1
cuadrado [3,3]: 6
El resultado es:
1
>>>