一、魔方阵规律;
8 1 6
3 5 7
4 9 2
魔方阵中各数的排列规律如下:
(1)将1放在第1行中间一列。
(2)从2开始直到n×n止,各数依次按此规则存放:每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列)。
(3)如果上一数的行数为1,则下一个数的行数为n(指最下一行)。例如,1在第1行,则2应放在最下一行,列数同样加1。
(4)当上一个数的列数为n时,下一个数的列数应为1,行数减1。例如,2在第3行最后一列,则3应放在第2行第1列。
(5)如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。例如,按上面的规定,4应该放在第1行第2列,但该位置已被1占据,所以4就放在3的下面。由于6是第1行第3列(即最后一列),故7放在6下面。
二、N-S流程图;
三、运行结果;
四、源代码;
# define _CRT_SECURE_NO_WARNINGS
# include <stdio.h>
int main()
{
//初始化变量值;
int a[15][15], p = 0, i, j, k, n;
//获取输出几阶魔法阵;
printf("请输入n的值:");
//循环判断n为小于15的奇数;
while (p == 0)
{
//获取用户输入数据;
scanf("%d", &n);
//判断;
if (n % 2 != 0)
{
p = 1;
}
}
//填充矩阵数据;
for (i = 1; i <= n; i++)
{
//列;
for (j = 1; j <= n; j++)
{
//填充;
a[i][j] = 0;
}
}
//赋值;
j = n / 2 + 1;
a[1][j] = 1;
//实现魔方阵;
for (k = 2; k < n * n; k++)
{
//运算;
i = i - 1;
j = j + 1;
//判断是否为第一行最后一列;
if ((i < 1) && (j > n))
{
i = i + 2;
j = j - 1;
}
else
{
//是否为第一行;
if (i < 1)
{
i = n;
}
//是否为最后一列;
if (j > n)
{
j = 1;
}
}
//判断数据存储位置是否为空;
if (a[i][j] == 0)
{
//填充;
a[i][j] = k;
}
else
{
i = i + 2;
j = j - 1;
a[i][j] = k;
}
}
//输出魔方阵;
for (i = 1; i <= n; i++)
{
//列;
for (j = 1; j <= n; j++)
{
//输出;
printf("%5d", a[i][j]);
}
//换行;
printf("\n");
}
return 0;
}