魔方陣の説明:

  • 魔方陣はN*Nの行列です;
  • この行列は各行、各列、対角線の和がすべて等しい;

魔方陣の例:

三次魔方陣

8   1   6

3   5   7

4   9   2

各行の和:

8+1+6=15;

3+5+7=15;

4+9+2=15;

各列の和:

8+3+4=15;

1+5+9=15;

6+7+2=15;

対角線の和:

8+5+2=15;

6+5+4=15;

魔方陣の計算規則(行、列は1から始まる):

1."1"を1行目の中央の列に置く;

2.2からN*Nまでの各数は次の規則に従う:各数を格納する行は前の数の行より1減る;各数を格納する列は前の数の列より1増える;

3.ある数の行が1の場合、次の数の行はN;

4.ある数の列がNの場合、次の数の列は1、行数は1減る;

5.上記の規則で決定された位置に数字がある場合、または前の数が1行目N列にある場合、

次の数字の位置は前の数の真下(すなわち行数が1減り、列数は変わらない);

ソースコード

#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");
}

上記コードの出力結果は次の通り:

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