#include<stdio.h>
#define M 507
main()
{
unsigned int a[M][M]={0},H[M]={0},V[M]={0};
unsigned int i,j,k,n;
unsigned int q=0,p=0;
i=0;j=M/2;a[i][j]=1;//第一行中间列为1
for(k=2;k<=M*M;k++)
{
i=(i+(M-1))%M;j=(j+1)%M;//从2开始后一个数在前一个数右上方,超过则回绕
if(a[i][j]==0)//初始状态(0状态)
a[i][j]=k;
else//非0状态,填到该数字正下方
{
i=(i+1)%M+1;
j=(j+(M-1))%M;
a[i][j]=k;
}
}
printf("%d阶魔方阵为:\n",M);
for(i=0;i<M;i++)
for(j=0;j<M;j++)
{
printf("%5d",a[i][j]);
if((j+1)%M==0) printf("\n\n");
}
printf("\n");
///////////////////////////////////验证
printf("%d阶魔方验证:\n",M);
for(n=0;n<M;n++)
for(j=0;j<M;j++)
{
V[n]=V[n]+a[n][j];//每行之和
H[n]=H[n]+a[j][n];//每列只和
}
for(i=0;i<M;i++)
{ p=p+a[i][i];//对角线只和
q=q+a[M-1-i][i];
printf("V[%d]=%d,H[%d]=%d\n",i,V[i],i,H[i]);
}
printf("p=%d\t,q=%d",p,q);
printf("\n");
}