幻方

日期: 08 月 23日, 2014
标签:

幻方,或称纵横图,由一组排放在正方形中的整数组成,其每行、每列以及两条对角线上的数之和均相等。通常幻方由从 1 到 N2 的连续整数组成,其中N为正方形的行或列的数目。因此 N 阶幻方有 N 行 N 列,并且所填充的数为从 1 到 N2

构造法

详见维基百科

代码

这里贴一个大一时写的代码,用混乱 C 语言写的:

#include <stdio.h>
int _[100][100],__[50][50],___,____,_____,______,_______,________;char *_________;int main(int __________){return(__________==1&&(___==0&&(printf("Enter n(n>0): "),scanf("%d",&___)),((___&1)&&(___&1)&&(_____=1,______=(___+1)/2,_[0][______-1]=1,_______=2)),(!(___&3)&&(_______=1)),(((___&3)==2)&&(____=___/2,_____=2,______=(____+1)/2-1,_______=1)),main(0))),(__________==0&&((((___&1)&&(_______<=___*___))||(!(___&3)&&(_______<=___*___))||(((___&3)==2)&&(_______<=____*____))||(!((___==2)&&printf("No solution.\n"))&&________<=___*___))&&(((_______<=___*___)&&((((___&1)&&((((_____==1&&______==___)||_[(___+_____-2)%___][______%___])?(_____=_____%___+1):(_____=(___+_____-2)%___+1,______=______%___+1)),_[_____-1][______-1]=_______))),((!(___&3)&&(_[(_______-1)/___][(_______-1)%___]=((_______%4<2)^((_______+___-1)/___%4<2))?(___*___+1-_______):_______))),(((___&3)==2)&&((((_____==1&&______==____)||__[(____+_____-2)%____][______%____])?(_____=_____%____+1):(_____=(____+_____-2)%____+1,______=______%____+1)),__[_____-1][______-1]=_______,_________=((_____>=___/4+3)?"\3\0\1\2":(((______==___/4+1)?(_____==___/4+1):(_____==___/4+2))?"\3\0\2\1":"\0\3\2\1")),_[_____*2-2][______*2-2]=_______*4-_________[0],_[_____*2-2][______*2-1]=_______*4-_________[1],_[_____*2-1][______*2-2]=_______*4-_________[2],_[_____*2-1][______*2-1]=_______*4-_________[3]))),((_______>___*___)&&printf(________%___?"%4d":"%4d\n\n",_[(________-1)/___][(________-1)%___]))),((___&1)&&(_______++)),(!(___&3)&&(_______++)),(((___&3)==2)&&(_______++),((_______>___*___)&&(________++))),main(0))));}

看不懂?嗯,我也看不懂当时是怎么写的了 >_< 。不过确实是能跑的,测试如下:

Enter n(n>0): 3
   8   1   6

   3   5   7

   4   9   2

Enter n(n>0): 4
   1  15  14   4

  12   6   7   9

   8  10  11   5

  13   3   2  16

Enter n(n>0): 5
  17  24   1   8  15

  23   5   7  14  16

   4   6  13  20  22

  10  12  19  21   3

  11  18  25   2   9

Enter n(n>0): 6
  32  29 136 133  24  21

  30  31 134 135  22  23

  12   9 137 140  28  25

  10  11 138 139  26  27

  13  16 144 141   5   8

  14  15 142 143   6   7