Description du carré magique :

  • Un carré magique est une matrice N*N ;
  • Les sommes de chaque ligne, de chaque colonne et des diagonales de cette matrice sont toutes égales ;

Exemple de carré magique :

Carré magique d'ordre 3 :

8   1   6

3   5   7

4   9   2

Somme de chaque ligne :

8+1+6=15;

3+5+7=15;

4+9+2=15;

Somme de chaque colonne :

8+3+4=15;

1+5+9=15;

6+7+2=15;

Somme des diagonales :

8+5+2=15;

6+5+4=15;

Règles de calcul du carré magique (les lignes et les colonnes commencent à 1) :

1. Placez "1" dans la première ligne, colonne du milieu ;

2. En partant de 2 jusqu'à N*N, chaque nombre suit cette règle : la ligne où chaque nombre est stocké est la ligne du nombre précédent moins 1 ; la colonne où chaque nombre est stocké est la colonne du nombre précédent plus 1 ;

3. Lorsque la ligne d'un nombre est 1, la ligne du nombre suivant est N ;

4. Lorsque la colonne d'un nombre est N, la colonne du nombre suivant est 1, et le numéro de ligne diminue de 1 ;

5. Si la position déterminée par les règles ci-dessus contient déjà un nombre, ou si le nombre précédent se trouve à la 1re ligne et à la colonne N,

le nombre suivant est placé directement sous le nombre précédent (c'est-à-dire que le numéro de ligne diminue de 1, la colonne reste inchangée) ;

Code source

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define N 5

int main()
{
    int a[N][N] = {0};
    int count = 1;
    int row = 0, cul = N / 2;
    while (count <= N*N)
    {
        a[row][cul] = count;
        int i = row;
        int j = cul;
        if (i == 0)
        {
            i = N - 1;
        }
        else
        {
            i = i - 1;
        }
        j = (j + 1) % N;
        if (a[i][j]!=0||(row==0&&cul==N-1))
        {
            i = row + 1;
            j = cul;
        }
        row = i;
        cul = j;
        count++;
    }

    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            printf("%3d",a[i][j]);
        }
        printf("\n");
    }

    system("pause");
}

La sortie du code ci-dessus est :

17 24  1  8 15
23  5  7 14 16
 4  6 13 20 22
10 12 19 21  3
11 18 25  2  9