Utilizando a linguagem de programação Python, através de uma função recursiva para geração de todas as combinações possíveis de números, consegui fazer um programa onde é possível a geração de quaisquer quadrado mágico. Porém, requer mais tempo. Segue o código
from math import sqrt
"""Esta função verifica se todos os termos do vetor são únicos"""
def unico(vet):
cont=0
uni=True
for each_term in vet:
for this_term in vet:
if each_term==this_term:
cont+=1
if(cont>1):
uni=False
cont=0
return uni
"""Esta é a função para comparar linhas, colunas e diagonais do quadrado mágico
Ela exige a passagem de um vetor como parâmetro. Obs.: 'Esta função somente funciona com vetores os quais sua ordem tenham raizes quadradas exatas"""
def compare(vet):
ordem=int(sqrt(len(vet)))
somas=[]
somas2=[]
somas3=[0]
somas4=[0]
magicSquare=False
acm=0
i=0
for each_term in vet:
acm+=each_term
if ((vet.index(each_term)+1)%ordem==0):
somas.append(acm)
acm=0
acm=0
for each_index in range(0,ordem):
somas2.append(0)
for each_term in vet:
somas2[i]+=each_term
i+=1
if i==ordem:
i=0
for inx in range(0,ordem):
somas3[0]+=vet[inx*(ordem+1)]
somas4[0]+=vet[(len(vet)-1)-(1+inx)*(ordem-1)]
somas=set(somas)
somas2=set(somas2)
somas3=set(somas3)
somas4=set(somas4)
if (somas==somas2==somas3==somas4):
magicSquare=True
return magicSquare
"""Esta função gera todas as combinações possíveis de acordo a ordem passada do vetor
Exemplo merge(vet, len(vet), len(vet)-1)"""
def merge (vet, tam, it):
quad=[]
if it>0:
for each_term in vet:
merge(vet, tam, it-1)
vet[it]+=1
vet[it]=1
else:
for each_term in vet:
if(unico(vet)):
if compare(vet):
quad.append(vet)
print(vet)
vet[it]+=1
vet[it]=1
return quad
vet=[1 for each_term in range(1,10)]
print(merge(vet, len(vet), len(vet)-1))
ShotScreen do programa em funcionamento
0 comentários:
Postar um comentário