生成奇数方阵

/*
任意输入一个奇数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

给TA捐赠
共{{data.count}}人
人已捐赠
其他

生成二维码的ahk代码

2020-3-9 4:13:44

其他

生成随机字母数字路径

2020-3-9 4:15:44

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索