#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"); }}