You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python生成幻方矩阵?现有代码仅支持奇数阶求修正

支持奇数阶与偶数阶的幻方生成代码修改

给定一个N×N规格的矩阵篮子,每个格子放入1到N²范围内的鸡蛋,需排列成幻方矩阵,使每行、每列及两条对角线的和相等。现有代码仅支持奇数阶幻方,需修改以支持偶数阶。

修改后的完整代码

def generate_magic_square(n):
    # 初始化矩阵
    magic_square = [[0 for _ in range(n)] for _ in range(n)]
    
    if n % 2 == 1:
        # 奇数阶幻方(原算法优化,修正整数除法)
        i = n // 2
        j = n - 1
        num = 1
        while num <= n * n:
            if i == -1 and j == n:
                j = n - 2
                i = 0
            else:
                if j == n:
                    j = 0
                if i < 0:
                    i = n - 1
            if magic_square[i][j] != 0:
                j -= 2
                i += 1
                continue
            magic_square[i][j] = num
            num += 1
            j += 1
            i -= 1
    elif n % 4 == 0:
        # 双偶阶幻方(n为4的倍数)
        for i in range(n):
            for j in range(n):
                magic_square[i][j] = (n * i) + j + 1
        # 反转特定区域的数字
        for i in range(n):
            for j in range(n):
                # 跳过4x4子块的对角线位置
                if (i % 4 == 0 and j % 4 == 0) or (i % 4 == 3 and j % 4 == 3) or \
                   (i % 4 == 0 and j % 4 == 3) or (i % 4 == 3 and j % 4 == 0):
                    continue
                # 在同一4x4子块的非对角线区域反转数字
                if (i // 4) % 2 == (j // 4) % 2:
                    magic_square[i][j] = n * n + 1 - magic_square[i][j]
    else:
        # 单偶阶幻方(n为偶数但非4的倍数,即n=4k+2)
        k = n // 2
        # 生成k阶奇数幻方作为基础
        odd_square = generate_magic_square(k)
        # 填充四个象限
        quadrant_offset = [0, 2*k*k, 3*k*k, k*k]
        for i in range(k):
            for j in range(k):
                magic_square[i][j] = odd_square[i][j] + quadrant_offset[0]
                magic_square[i][j + k] = odd_square[i][j] + quadrant_offset[1]
                magic_square[i + k][j] = odd_square[i][j] + quadrant_offset[2]
                magic_square[i + k][j + k] = odd_square[i][j] + quadrant_offset[3]
        # 交换左侧象限的特定元素
        for i in range(k):
            for j in range(k):
                if j != k // 2:
                    # 上半部分非中间列交换
                    if i < k // 2:
                        magic_square[i][j], magic_square[i + k][j] = magic_square[i + k][j], magic_square[i][j]
                    # 中间行非倒数第二列交换
                    if i == k // 2 and j != k // 2 - 1:
                        magic_square[i][j], magic_square[i + k][j] = magic_square[i + k][j], magic_square[i][j]
        # 交换中间位置的元素
        magic_square[k//2][k//2], magic_square[k//2 + k][k//2] = magic_square[k//2 + k][k//2], magic_square[k//2][k//2]
    
    # 计算并输出幻和
    magic_sum = n * (n * n + 1) // 2
    print(f"每行、每列及对角线的鸡蛋总和: {magic_sum}\n")
    # 格式化输出矩阵
    for row in magic_square:
        print(' '.join(f"{num:2d}" for num in row))

if __name__ == "__main__":
    n = int(input("请输入矩阵的行数: "))
    if n < 3:
        print("幻方至少需要3阶(3×3及以上)")
    else:
        generate_magic_square(n)

代码功能说明

  • 奇数阶幻方:保留原算法核心,修正了整数除法问题,确保索引为整数,避免类型错误。
  • 双偶阶幻方:先按顺序填充数字,再反转4×4子块内非对角线位置的数字,保证行、列、对角线和一致。
  • 单偶阶幻方:基于奇数阶幻方生成四个象限,通过交换特定位置元素调整幻和,适配n=4k+2类型的偶数阶。

内容的提问来源于stack exchange,提问作者chirag2430

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 03:25:28