n*n 魔方阵 (n=2k+1) 
一、什么是魔方阵?
魔方矩阵,又称幻方,是具有相同的行数和列数,并在每行每列、对角线上的和都相等的矩阵。
二、魔法阵的实行方法
1、奇数阶魔方阵(n=2k+1)
1)首先确定1的位置:位于第一行n+1/2(奇数行最中间一列)
2)下一个数放到上一个数的右上角(即上一行下一列),若无上一行则放到第n行(因为是左上角-->
相应的列加1),若无下一列则放到第一列(因为是左上角-->相应的行减1)
3)若新位置已经放了数,则将其放入上一个数的正下方(即下一行的同一列)
4)重复(2)和(3)。
代码实现
#include<stdio.h>
#pragma warning(disable : 4996)
int main()
{
int i,i1,j1;
int j;
int n,p;
int arr[100][100];
printf("魔法矩阵阶数");
scanf("%d",&n);
for ( i = 1; i <=n; i++)
{
for ( j = 1; j <=n; j++)
{
printf("%2d", arr[i][j] = 0);//二维数组进行初始化
}
printf("\n");
}
printf("\n");
i = 1;//确定数字1的位置;
j = (n + 1) / 2;//确定数字1的位置,位于第一行第奇数列中间位置;
arr[1][j] = 1;
for ( p =2; p<=n*n; p++)//从数字2开始到(n*n)进行魔法方阵规律排列;
{
i1 = i;//新定义:行;
j1 = j;//新定义:列;
i--;//实则下一个数放到上一个数的右上角(即上一行下一列)则行减1;
j++;//列加1(即上一行下一列);
if (i<1)//若无上一行则放到最后一行;
{
i = n;
}
if (j>n)//若无下一列则放到第一列;
{
j = 1;
}
if (arr[i][j])//若新的位置上已经放了数,则将其放入上一个数的正下方
{
i = i1 + 1;//行加1(即下一行的同一列);
j = j1;//列不变(即下一行的同一列);
}
arr[i][j]=p;
}
for (i = 1; i <=n; i++)
{
for (j = 1; j <=n; j++)
{
printf("%5d", arr[i][j]);
}
printf("\n");
}
return 0;
// }