魔方陣の説明:
- 魔方陣は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");
}
#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