//思想:将1存入第一行中间,以后的元素初始化,是讲上一个元素的横坐标+1,纵坐标-1。如果超出数组的方位,则分别放到第一列和第一行。
#include<stdio.h>
int main(int argc, const char * argv[]) {
int n;
printf("请输入魔方阵的大小:\n");
scanf("%d",&n); //输入奇数,
while (n%2==0) { //判断输入是否正确
printf("输入有误,请重新输入奇数:\n");
scanf("%d",&n);
}
int a[n][n]; //初始化数组
int num,i,j; //num:用于计数;i:用于存储行;j:用于存储列
for (i=0; i<n; i++) { //初始化数组元素都为0
for (j=0; j<n; j++) {
a[i][j]=0;
}
}
num=0;
j=n/2;
i=0;
a[i][j]=1; //首先设置1的位置。
for (int t=2; num!=n*n-1;t++ ) {//利用for循环对数组元素依次赋值
int i1=i,j1=j; //保存上次初始化的元素的坐标
if (j+1<n) {
j+=1;
}else{
j-=(n-1); //当列加1向右超出数组,则使它转到第一列
}
if (i-1>=0) {
i-=1;
}else{
i+=(n-1); //当行减1向上超出数组,则使它转到第一行
}
if (a[i][j]==0) { //判断将要初始化的元素是否为0.
a[i][j]=t; //如果为0,则对其初始化;
}else{ //如果不为0,则不需要初始化;对上一个元素的下方的元素初始化。
i=i1+1;
j=j1;
a[i][j]=t;
}
num++; //计数
}
for (i=0; i<n; i++) { //输出数组
for (j=0; j<n; j++) {
printf("%4d\t",a[i][j]);
}
printf("\n");
}
return 0;
}