c语言输出魔方阵程序解释

程序如下:
#include <stdio.h>
#define N 16 //这里可以修改N的值
int main()
{
int a[N][N],i,j,k,p,m,n;
p=1;

while(p==1) /*要求阶数为1~15的商数*/
{ printf("Enter n(n=1~15):"); //可以输入小于等于N-1的整数
scanf("%d",&n);
if((n!=0)&&(n<=N-1)&&(n%2!=0)) p=0;
}

for(i=1;i<=n;i++) /*初始化*/
for(j=1;j<=n;j++) a[i][j]=0;

j=n/2+1; /*建立魔方阵*/
a[1][j]=1;

for(k=2;k<=n*n;k++)
{ i=i-1;
j=j+1;
if((i<1)&&(j>n))
{ i=i+2;
j=j-1;
}
else
{ if(i<1) i=n;
if(j>n) j=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");
}
return 0;
}
问题1:for(k=2;k<=n*n;k++)
{ i=i-1;
j=j+1;
if((i<1)&&(j>n))
{ i=i+2;
j=j-1;
}
中if((i<1)&&(j>n))
{ i=i+2;
j=j-1;
是什么意思,作用是什么,可以举个例看看吗?
问题2:if(a[i][j]==0) a[i][j]=k;
else
{ i=i+2;
j=j-1;
a[i][j]=k;
}
这句是什么意思,a[i][j]怎么可能为0呢?
问题3:最后的return=0这句的作用是什么?
不好意思哦,问题1还有点不明白。
我是这样认为的:当一个数在第一行则下一个数在最后一行,是吧? 当一个数在最后一列,则下一个数在第一列,是吧?
那么为什么会同时满足 if((i<1)&&(j>n))
{ i=i+2;
j=j-1;
呢?为什么是i=i-2,j=j-1.
首先魔方阵是一个奇数行列式方阵,它的一行,一列,对角线的和都相等。
建立魔方阵的第弊哪氏一步是确定1的位置,它是第一行的中间列,之后要确定其他位置的值,
问题1:if((i<1)&&(j>n))时,说明你确定的位置已经超出了魔方阵,所以要用i=i+2;j=j-1;把它拉回的魔方阵内,
问题2:判断第i行地j列的值是否等于0(即是否被填充),如果没填充,就填k,如果填充,再寻找下一个位置,
问题3:因为你的主函数main()前面的返回值为int,所以要提供返回值,那不是return=0,而是return 0;就是租散返回0,也可以缓森返回1,这没关系的,如果不想要也行,那得把main()前面的int 改为void .