Python之任意阶幻方的构造

Python构造幻方
本文介绍使用Python构造不同阶幻方的方法,包括奇数阶、4n阶和4n+2阶幻方,并提供了详细的代码实现。

  本文在用Python构造任意阶幻方的时候,参考的资料如下: 
- 维基百科:https://en.wikipedia.org/wiki/Magic_square
- 幻方:http://blog.youkuaiyun.com/dxx_111/article/details/50158355
- 论文:由矩阵构造奇数阶幻方的方法,高建国,河南大学学报

Python代码如下:(具体的构造方法可参看以上资料)

# -*- coding: utf-8 -*-
#利用numpy模块构造幻方
import numpy as np

#列表循环向左移offset位
def shift_left(lst, offset):
    return [lst[(i+offset)%len(lst)] for i in range(len(lst))]

#列表循环向右移offset位
def shift_right(lst, offset):
    return [lst[i-offset] for i in range(len(lst))]

#构造奇数阶幻方函数
def magic_of_odd_order(n):
    p = (int)((n-1)/2)

    #创建矩阵1
    initial_lst1 = list(range(p+1,n))+list(range(p+1))
    initial_mat1 = []
    for i in range(n):
        initial_mat1.append(shift_left(initial_lst1, i))
    mat1 = np.array(initial_mat1)

    #创建矩阵2
    initial_lst2 = list(range(p,-1,-1))+list(range(2*p,p,-1))
    initial_mat2 = []
    for i in range(n):
        initial_mat2.append(shift_right(initial_lst2, i))
    mat2 = np.array(initial_mat2)

    #创建矩阵3,即元素全为1的矩阵
    mat3= np.ones((n,n),dtype=np.int)

    #构造幻方
    magic = n*mat2+mat1+mat3
    return magic

#构造4n阶幻方函数
def magic_of_4n_order(n):
    mat = np.array(range(1,n*n+1)).reshape(n,n)
    for i in range((int)(n/4)):
        for j in range((int)(n/4)):
            for k in range(4): #将每个4*4小方块的对角线换成互补元素
                mat[k+4*j][k+4*i] = n*n+1-mat[k+4*j][k+4*i]
                mat[k+4*j][3-k+4*i] = n*n+1-mat[k+4*j][3-k+4*i]

    return mat

#构造4n+2阶幻方函数
def magic_of_4n2_order(n):
    p = (int)(n/2)
    matA = magic_of_odd_order(p)
    matD = matA+p**2
    matB = matD+p**2
    matC = matB+p**2

    #交换矩阵块A与矩阵块C中特定元素的位置
    row = (int)((p-1)/2)
    for i in range(p):
        if i != row:
            for k in range((int)((n-2)/4)):
                matA[i][k],matC[i][k] = matC[i][k],matA[i][k]
        else:
            for k in range((int)((n-2)/4)):
                matA[i][row+k],matC[i][row+k] = matC[i][row+k],matA[i][row+k]

    #交换矩阵块B与矩阵块D中特定元素的位置
    col = (int)((p-1)/2)
    for j in range(col+2-(int)((n-2)/4),col+1):
        for i in range(p):
            matB[i][j],matD[i][j] = matD[i][j],matB[i][j]

    #合并矩阵块A,B,C,D组成幻方
    magic = np.row_stack((np.column_stack((matA,matB)),np.column_stack((matC,matD))))
    return magic

def main():
    order = eval(input('Enter the order of magic square(>=3): '))

    if order%2 ==1:
        magic = magic_of_odd_order(order)
    elif order%4 == 0:
        magic = magic_of_4n_order(order)
    else:
        magic = magic_of_4n2_order(order)
    print('Generating magic square of %d order......'%order)

    for row in magic:
        for col in row:
            print(col, end='\t')
        print()

    #验证生成的magic是否为幻方    
    val = input(("Do you want to validate?[Y|N]"))
    if val == 'Y' or val == 'y':
        print('每行的和:', np.sum(magic, axis=0))
        print('每列的和:', np.sum(magic, axis=1))
        print('主对角线的和:', sum([magic[i][i] for i in range(order)]))
        print('副对角线的和:', sum([magic[i][order-1-i] for i in range(order)]))
    print('It\'s Done!')

main()

运行结果如下:
这里写图片描述
这里写图片描述
这里写图片描述



本次分享到此结束,欢迎大家批评与交流~~

### 使用Python实现任意幻方 #### 定义幻方 幻方是一个n×n矩阵,其中填入1到n²的自然数,并满足每一行、列以及两条对角线上的数字之和相等。这种特性使得构建幻方成为了一个有趣的算法挑战。 #### 奇数幻方:Siamese方法 对于奇数幻方,可以采用经典的Siamese(暹罗)方法来构造[^1]: ```python def create_odd_magic_square(n): magic_square = [[0 for _ in range(n)] for _ in range(n)] i, j = 0, n//2 for num in range(1, n*n + 1): magic_square[i][j] = num next_i = (i - 1) % n next_j = (j + 1) % n if magic_square[next_i][next_j]: i += 1 else: i, j = next_i, next_j return magic_square for row in create_odd_magic_square(3): print(row) ``` 上述代码展示了如何利用Siamese方法创建一个简单的三幻方。该过程从中心位置开始填充第一个元素,之后按照特定规律移动指针直到完成整个表格的填写。 #### 双偶数幻方:逐层复制法 当面对双偶数(即4m)的情况时,则可运用逐层复制的方法来进行处理[^2]: ```python import numpy as np def make_double_even_magic_square(size=8): assert size%4==0,"Size must be multiple of four." quarter_size=size//4 base=np.arange(1,size*size+1).reshape((size,size)) mask=np.zeros_like(base,dtype=bool) # Fill the corners with True values. for r in range(quarter_size): for c in range(quarter_size): mask[r,c]=True;mask[size-r-1,c]=True; mask[r,-c-1]=True;mask[-r-1,-c-1]=True; result=(base&~mask)|(((size*size)+1-base)&mask) return result.tolist() print(np.array(make_double_even_magic_square())) ``` 这段脚本通过先建立基础序列再调整某些部分的位置关系实现了四倍整除尺寸下的幻方生成逻辑。 #### 单偶数幻方:Kraitchik's method 单偶数(即4m+2形式),通常会应用更复杂的策略如Kraitchik提出的办法[^3]。这里提供一种简化版思路用于理解而非实际最优解: ```python from copy import deepcopy def build_single_even_magic_square(order): half_order = order // 2 small_square = create_odd_magic_square(half_order) big_square = [] for line in small_square * 2: new_line_1 = [(val + ((order*order)//4)) if idx >= half_order else val for idx,val in enumerate(line)] new_line_2 = [new_line_1[idx]+half_order*(idx<half_order)*2-(not(idx<half_order))*2 for idx in range(len(new_line_1))] big_square.append(deepcopy(new_line_1)) big_square.append([x+(len(small_square)**2)*(y>=half_order) for y,x in enumerate(new_line_2)]) exchange_positions(big_square,half_order) return big_square def exchange_positions(matrix,k): matrix[k-1],matrix[k]=matrix[k][:],matrix[k-1][:] for col in range(k): temp=matrix[col][k];matrix[col][k]=matrix[2*k-col-1][col+k+1];matrix[2*k-col-1][col+k+1]=temp temp=matrix[col+k+1][k];matrix[col+k+1][k]=matrix[2*k-col-1][2*k-col-1];matrix[2*k-col-1][2*k-col-1]=temp single_even_example = build_single_even_magic_square(6) for l in single_even_example: print(l) ``` 以上三种情况覆盖了不同类型的幻方构建方式,在实践中可以根据具体的数选择合适的技术路径去解决问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值