这是书上的一个习题 输出魔方阵的

魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2…n的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。

如3×3的魔方阵:
  8 1 6   3 5 7   4 9 2
  魔方阵的排列规律如下:
  ⑴将1放在第一行中间一列;
  ⑵从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);
  ⑶如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;
  ⑷当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;
  ⑸如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;#include <stdio.h>
  #define N 16 //这里可以修改N的值
  int main()
  {
  int a[N][N]={0},i,j,k,p,m,n;
  p=1;
  while(p==1)
  {
  printf("Enter n(1~%d): ",N-1);/*可以输入小于等于N-1的整数*/
  scanf("%d",&n);
  if((n!=0)&&(n<N)&&(n%2!=0)) p=0;
  }
  i=n+1;
  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");
  }

 

我想问的是中间if((i<1)&&(j>n))

  {

  i=i+2;j=j-1;

  }这一句是什么意思啊?j能>n吗?为什么i=i+2;j=j-1啊?当if成立的时候,下一个数不是应该在上一个数的正下方吗?