#include <stdio.h>
/*魔方阵排列规律(必须是奇数×奇数阵)
(1)将1放在第一行中间一列
(2)从2开始直到n*n,各数依次按下列规则存放:
每一个数存放的行比前一个数行减一
列数加1
(3)如果上一数的行数为1,则下一个数行为n(最下一行)
(4)当上一个数列为n是时,则一下数的列数应为1,行数减1
(5)如果按上面规则确定位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面
*/
void main(void)
{
int a[16][16];
int i,j,k,p,m,n;
p=1; //表示阶数为偶数
while(p==1) //若输入的数不符合要求,提示重新输入
{
printf("请你输入阶数(奇数)(1--15):");
scanf("%d",&n);
if((n>=1) && (n<=15) && n%2!=0)
{
p=0;
}
else
{
NULL;
}
}
//初始化
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
a[i][j]=0;
}
}
//建立魔方阵,i表示行,j表示列
i=1; //1所在的行
j=(n/2)+1; //1所在的列
a[i][j]=1; //将1 放在第一行中间一列
for(k=2; k<=n*n; k++) //将2到n*n放到方阵中
{
i=i-1; //行数减1
j=j+1; //列数加1
if(i<1 && j>n) //上一个数是第1行第n列时,则把下一个数放在上一个数的下面
{
i=i+2; //因为行数已经减1,所以需加2
j=j-1; //因为列数已经加1,所以需减1
}
else
{
if(i<1) //如果上一数的行数为1,则下一个数行为n(最下一行)
i=n;
if(j>n) //当上一个数列为n是时,则一下数的列数应为1,行数减1
{
j=1; //行数已经减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("%4d",a[i][j]);
}
printf("/n");
}
}