利用C语言玩转魔方阵实例教程

  

  

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

  

如3×3的魔方阵:
  

        8 1 6   3 5 7   4 9 2      

魔方阵的排列规律如下:
  

  

,,,,,(1)将1放在第一行中间一列;
  

  

,,,,,(2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列),
  

  

,,,,,(3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行),例如1在第一行,则2应放在最下一行,列数同样加1;
  

  

,,,,,(4)当上一个数的列数为n时,下一个数的列数应为1,行数减1去。例如2在第3行最后一列,则3应放在第二行第一列;
  

  

,,,,,(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行2列第,但该位置已经被占据,所以4就放在3的下面;

  

  

奇数魔方阵就是将数字排列在nxn (n为奇数)的方阵上,要求满足各行,各列与各对角线的和相同。如下图所示,是n=5的奇数魔方阵。

  

利用C语言玩转魔方阵实例教程”> <br/>
  </p>
  <p>填魔方阵的方法以奇数魔方阵最为简单,第一个数字放在第一行的正中央(填了1),然后向右(左)上填,如果右(左)上已有数字,则向下填,如下图所示:</p>
  <p> <img src=   # include      # include      #定义N 5      int主要(空白){      int i, j键;      int广场(N + 1) (N + 1)={0};      我=0;      j=(N + 1)/2;      (关键=1;关键& lt;=N * N;键+ +){      如果((关键% N)==1)      我+ +;      其他{      我,;      + +;      }      如果(i==0)      我=N;      如果(j比;N)      j=1;      广场[我][j]=关键;      }      (i=1;我& lt;=N;我+ +){      (j=1;j & lt;=N;j + +)      printf (" % 2 d”,广场[我][j]);      printf (" ");      }      返回0;      }      

  

与奇数魔术方阵相同,在于求各行,各列与各对角线的和相等,不同的是这次方阵的维度是4的倍数。

  

先来看看4 x4方阵的解法:

  

利用C语言玩转魔方阵实例教程”> <br/>
  </p>
  <p>简单的说,就是一个从左上由1依序开始填,但遇对角线不填,另一个由左上由16开始填,但只填在对角线,再将两个合起来就是解答了。如果N大于等于2,则以4 x4为单位画对角线,如下所示:</p>
  <p> <img src=   # include      # include      #定义N 8      int主要(空白){      int i, j。      int广场(N + 1) (N + 1)={0};      (j=1;j & lt;=N;j + +) {      (i=1;我& lt;=N;我+ +){      如果(j % 4==我% 4 | | (j我% % 4 + 4)==1)      广场[我][j]=(N + 1) * N - j + 1;      其他的      广场[我][j]=(i - 1) * N + j;      }      }      (i=1;我& lt;=N;我+ +){      (j=1;j & lt;=N;j + +)      printf (" % 2 d”,广场[我][j]);      printf (" ");      }      返回0;      }

利用C语言玩转魔方阵实例教程