Carré Magique proposé dans le concours de présélection à CFMOTI
Dans un tableau à n lignes et n colonnes(n impair) ,ranger les nombres entiers de 1 à N2 de manière à ce que la somme des éléments de chaque ligne soit égale à la somme des éléments de chaque colonne et à la somme des éléments de chaque diagonale.
6 1 8
7 5 3 est un carré magique dont la somme est 15
2 9 4
Le principe exposé ci_après est l’une des méthodes de création d’un carré magique :
Pour commencer 1 est placé dans la case centrale de la première ligne ;
Ensuite les entiers de 2 à N^2 sont placés les uns après les autres dans les cases d’une diagonale orientée Nord-ouest.
Plusieurs cas particuliers peuvent se présenter :
- si on tombe hors du carré en haut,le nombre est placé dans la dernière ligne sans changer de colonne
- si on tombe hors du carré à gauche,le nombre est placé dans la colonne de droite sans changer de ligne
- si on tombe dans une case déjà occupée ,le nombre est placée sous la case précédemment remplie. A chaque fois qu’un multiple de N est placé dans une case ,la case destinée au nombre suivant est normalement occupée.
la solution Suite ->
Solution VB.Net:
Dim T(,), n, i, PosL, PosC As Integer
Do
Console.WriteLine("Donnez un nombre impaire")
n = Console.ReadLine
Loop Until n Mod 2 = 1
ReDim T(n, n)
PosL = 1
PosC = (n + 1) / 2
T(PosL, PosC) = 1
i = 2
Do While i <= n ^ 2
PosL = PosL - 1
PosC = PosC - 1
If (i - 1) Mod n = 0 Then
PosL = PosL + 2
PosC = PosC + 1
T(PosL, PosC) = i
ElseIf PosL <= 0 Then
PosL = n
PosC = PosC
T(PosL, PosC) = i
ElseIf PosC <= 0 Then
PosL = PosL
PosC = n
T(PosL, PosC) = i
Else
T(PosL, PosC) = i
End If
i += 1
Loop
For j As Int16 = 1 To n
For k As Int16 = 1 To n
Console.Write(Right("00" & T(j, k), 2) & " | ")
Next
Console.WriteLine()
Next
Console.ReadLine()