/* 任意输入一个奇数n,组成一个魔术方阵,其中元素由1~n*n构成!方阵的行和列长度均为n.并且行·列·对角线的和均相等! 例如3: 8 1 6 3 5 7 4 9 2 6 1 8 7 5 3 2 9 4 例如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 15 8 1 24 17 16 14 7 5 23 22 20 13 6 4 3 21 19 12 10 9 2 25 18 11 */ /* 输出1,后探测2的位置,若上边则对调到下面 输出2,探测3的位置,若右边则对调到左边 输出3,探测4的位置,若已有数据,则在本位置下边。 输出4,探测5的位置,正常 输出5,探测6的位置,正常 输出6,探测7的位置,右上角,则在本位下边 输出7,探测8的位置,若右边,则对调到左边 输出8,后探测9的位置,若上边则对调到下面 输出9,结束。 17 24 1 8 15 23 5 7 14 16 输出14,探测15的位置,右上角,则在本位下边 4 6 13 20 22 输出5,探测6的位置,若已有数据,则在本位置下边。 10 12 19 21 3 11 18 25 2 9 /* 用Ahk实现了这个算法。 运行方式:打开一个excel,鼠标点中某单元格,按win+t即可输出上述方阵。 */ #Persistent #SingleInstance force ;~ run excel Return #t:: inp: InputBox, num, INPUT, Please input a number,,280,130,,,,,5 if ErrorLevel return else if mod(num,2)=0 { MsgBox 不要输入偶数 goto inp } else loop_num:=num*num ;~ MsgBox %loop_num% ;~ Return x:=ceil((num+1)/2) y:=1 direction:=9 ;ru右上方 init_array(num,num) ;数组用之前应该初始化,否则有上次的运行结果影响程序的正确性 loop,%loop_num% { send %a_index% array(x,y,a_index) ;切记 传递参数时不可以用 % ReturnString:=test(x,y,direction,num) StringSplit, word_array,ReturnString,| fromX:=x fromY:=y x:=word_array1 y:=word_array2 ;~ send %ReturnString%,%a_index% ;~ send {down} go(fromX,fromY,x,y) } Return test(_x,_y,_direction,num) { ;~ global 用之会导致错误,因old_x会保存上次 运行结果 old_x=_x old_y=_y if(_direction=9) { _x+=1 _y-=1 } if(_direction=1) { _x-=1 _y+=1 } if(_direction=8) { _y-=1 } if(_direction=2) { _y+=1 } If _ynum) { ;~ msgbox 右边 93 WhichSide:=93 } If (_ynum) { WhichSide:=9 ;右上角 } if (_xnum) { ;~ MsgBox 下边 13 WhichSide:=13 } if (_x>=1 && _y>=1 && _x0 { loop,% Abs(dx) { ;~ x+=1 r() } } if dx0 { loop,% Abs(dy) { ;~ y+=1 d() } } if dy