话不多说,书接上回。拖延良久之后,单偶数幻方的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”)

作者 hsyyf

《幻方构造(三)》有3条评论

回复 ixwebhosting 取消回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注