魔方阵即奇数阶矩阵的各行各列每个对角线数字之和相等。
仔细观察可以发现数字排列规则,以下代码中会做注释
#include <stdio.h>
#include <stdlib.h>
void main(){
int a[20][20]={0};
int i=0,j,n,num=1,sum;
int k,m;
printf("输入矩阵阶数");
scanf("%d",&n);
sum = n * n;
j = n/2;
//a[i][j]下一个数a[i-1][j+1],如果i=0时,下一个数的i=n-1,如果j=n-1,下一个数的j=0,1在a[0][(n-1)/2]的位置
//如果下一个位置被占用了,则数字放在a[i][j]下方,同样,若i=n-1,那么将数字放到a[0][j]的位置
while(num<=sum)
{
a[i][j] = num++;
k = i;m = j;
if(i > 0)
i = i - 1;
else
i = n - 1;
if(j < (n-1))
j = j + 1;
else
j = 0;
if(a[i][j] != 0)//被占用
{
i = k;
j = m;
if(i == n - 1)
i = 0;
else
i = i + 1;
}
}
for(i = 0;i < n;i++)
{
for(j = 0;j < n;j++)
printf("%5d",a[i][j]);
printf("\n");
}
}
运行结果