话不多说,书接上回。拖延良久之后,单偶数幻方的LUX方法新鲜出炉。之前说过,单偶阶幻方的构造是最麻烦的,一般没有直接法。而然,难者不会,会者不难,经过一系列的摸索与研究,终于明白lux方法的大致原理,相比于其他方法虽然算法简明但过程繁琐。
单偶阶幻方的LUX构造步骤如下:
1.对于(2M+2)阶幻方,先排出(2M+1)阶幻方。
2.在前M+1行上,属性值标记为L,M+1行中间的标记为U;在第M+2行上,属性值标记为U,中间的标记为L;其余标记为X。
3.将(2M+1)阶幻方中每个元素k扩展为2*2的矩阵[[k,k],[k,k]],将矩阵乘以4然后减去4.
4.属性为L的矩阵,做如下处理:[[k+4,k+1],[k+2,k+3]];属性为U的矩阵,做如下处理:[[k+1,k+4],[k+2,k+3]],.属性为X的矩阵,做如下处理:[[k+1,k+4],[k+3,k+2]。
构造完成。
#!/usr/bin/env python3
#单偶阶幻方
k=int(input(“请输入一个单偶数(k<18):”))
n=k//2
Magic=[([0]*n)for i in range(n)]
i=0
j=(n−1)//2
Magic[i][j]=1
for m in range(2,n*n+1,1):
i0=i
j0=j
i=(i+n−1)%n
j=(j+n+1)%n
if Magic[i][j]!=0:
i=(i0+n+1)%n
j=j0
if i0==0 and j0==n−1:
i=1
j=n−1
Magic[i][j]=m
Even=[([0]*k)for i in range(k)]
for i in range(0,k,2):
for j in range(0,k,2):
i0=i//2
j0=j//2
if i<=n−2 or (i==n−1 and j!=(n−1)//2+2) or (i==n+1 and j==(n−1)//2+2):
Even[i][j]=4*Magic[i0][j0]
Even[i][j+1]=Even[i][j]−3
Even[i+1][j]=Even[i][j]−2
Even[i+1][j+1]=Even[i][j]−1
else:
if (i==n−1 and j==(n−1)//2+2) or (i==n+1 and j!=(n−1)//2+2):
Even[i][j]=4*Magic[i0][j0]−3
Even[i][j+1]=Even[i][j]+3
Even[i+1][j]=Even[i][j]+1
Even[i+1][j+1]=Even[i][j]+2
else:
Even[i][j]=4*Magic[i0][j0]−3
Even[i][j+1]=Even[i][j]+3
Even[i+1][j]=Even[i][j]+2
Even[i+1][j+1]=Even[i][j]+1
for i in range(k):
for j in range(k):
print(“%3d”%Even[i][j],end=’ ‘)
print()
input(“Press <Enter> to end”)
好深奥的,不是太懂的,来好好学学
而然……
我把lux看成linux了
码盲飘过。