Posté par
Tolokoban Tolokoban
Comme on n'a aucune contrainte sur les diagonales, quand on trouve une solution, on peut permutter les lignes et les colonnes et on a toujours la même solution avec une grille différente (la multiplication est commutative).
On peut donc s'arranger pour rechercher des solutions dont l'élément du coin supérieur gauche soit toujours le plus petit élément de la grille.
On commence alors par regarder ce qu'il se passe si cet élément minimal vaut 1.
On a la grille suivante :
1 a b
c d e
f g h
a*b = a*d*g = b*e*h
c*f = c*d*e = f*g*h
Donc :
a = e*h
b = d*g
c = g*h
f = d*e
Ce qui signifie qu'il nous suffit de déterminer 4 inconuues : d, e, g et h.
Pour 4 valeurs données A, B, C et D, on a quatre configurations possibles pour nos quatre inconnues :
AB AB AC AD
CD DC DB BC
Tout autre arrangement de ces possibilités est une symétrie de l'un de ces quatre.
On va donc itérer sur l'algorithme suivant :
Pour
n variant de 4 à l'infini
On met
n boules dans un sac : {2, 3, ...,
n+1}
Pour tout tirage de 4 boules (A,B,C,D) dans ce sac
On teste les 4 carrés magiques issus des 4 affectations possibles de (a,b,c,d) depuis (A,B,C,D)
Si les huit variable (a,b,c,d,e,f,g) sont distinctes et que
la grille résultante est un carré magique, on sort de l'algo en affichant le résultat.
Fin Pour
Fin Pour
Cet algo ne nous donne pas la meilleure solution, mais juste la solution suivante qui nous sert de point de départ :
Product = 180
1 15 12
18 2 5
10 6 3
La valeur maximale est 18, cela nous donne une borne max que l'on va pouvoir injecter dans notre algorithme final
puisqu'il est inutile de tester des grilles dans lesquelles on aurait une valeur supérieure à 18.
Voici l'algo final :
Pour
min variant de 1 à 10
Pour
n variant de 4 à 18
On met
n boules dans un sac : {1 +
min[/min], ..., 1 + [b]n}
Pour tout tirage de 4 boules (A,B,C,D) dans ce sac
On teste les 4 carrés magiques issus des 4 affectations possibles de (a,b,c,d) depuis (A,B,C,D)
Si les huit variable (a,b,c,d,e,f,g) sont distinctes et que
la grille résultante est un carré magique, on sort de l'algo en affichant le résultat.
Fin Pour
Fin Pour
Fin Pour
Cet algorithme est fini et possède même relativement peu d'étapes. L'implémentation en JAVA s'exécute en moins d'une seconde.
----
Voilà, j'espère que ce que je dis est correct, mais si vous voyez la "poutre" qui est dans ma démo, je suis preneur de votre correction.
Merci.