魔方阵(Magic Square)是指一个 n×n 的方阵,满足每行、每列、两条主对角线的元素之和都相等(这个和称为 “魔和”)。常见的魔方阵为 奇数阶(n=3,5,7...),其构造有固定算法;偶数阶魔方阵又分为单偶数(n=4k+2)和双偶数(n=4k),构造规则更复杂。
下面将用 Python 实现 奇数阶魔方阵(最经典、最易理解),并附带原理说明和示例。
一、奇数阶魔方阵构造原理(罗伯法)
核心规则(以 n=3 为例):
- 把数字 1 放在第一行正中间;
- 后续数字按 右上方向(行 - 1,列 + 1)依次填充;
- 若右上超出方阵上边界(行 < 0),则换行到最下方(行 = n-1);
- 若右上超出方阵右边界(列 >=n),则换列到最左侧(列 = 0);
- 若右上位置已被填充,则跳到当前数字的正下方(行 + 1,列不变)。
二、Python 实现代码(奇数阶)
python
运行
def create_magic_square(n):
"""
生成奇数阶魔方阵(n必须是奇数)
:param n: 方阵阶数(int,需满足 n % 2 == 1 且 n >= 3)
:return: 魔方阵(二维列表)
"""
# 校验输入:必须是奇数且>=3
if n % 2 == 0 or n < 3:
raise ValueError("请输入大于等于3的奇数!")
# 初始化 n×n 的零矩阵
magic_square = [[0 for _ in range(n)] for _ in range(n)]
# 初始位置:第一行正中间(行=0,列=n//2)
row, col = 0, n // 2
# 填充 1~n² 的所有数字
for num in range(1, n*n + 1):
magic_square[row][col] = num # 填充当前数字
# 计算下一个位置(右上方向)
next_row = row - 1
next_col = col + 1
# 规则3:超出上边界,换行到最下方
if next_row < 0:
next_row = n - 1
# 规则4:超出右边界,换列到最左侧
if next_col >= n:
next_col = 0
# 规则5:下一个位置已填充,跳到当前位置正下方
if magic_square[next_row][next_col] != 0:
next_row = row + 1
next_col = col
# 更新当前位置,准备填充下一个数字
row, col = next_row, next_col
return magic_square
def print_magic_square(magic_square):
"""美观打印魔方阵"""
n = len(magic_square)
# 计算每个数字的最大宽度(用于对齐)
max_width = len(str(n*n)) + 1
for row in magic_square:
# 格式化每行,使数字对齐
print("".join(f"{num:>{max_width}}" for num in row))
# ------------------- 测试示例 -------------------
if __name__ == "__main__":
# 生成3阶魔方阵(最经典)
n = 3
magic = create_magic_square(n)
print(f"{n}阶魔方阵:")
print_magic_square(magic)
# 验证魔和(每行/每列/对角线之和应相等)
magic_sum = n * (n*n + 1) // 2 # 魔和公式:n*(n²+1)/2
print(f"\n理论魔和:{magic_sum}")
# 验证每行之和
row_sums = [sum(row) for row in magic]
print(f"实际每行之和:{row_sums}")
# 验证每列之和
col_sums = [sum(col) for col in zip(*magic)]
print(f"实际每列之和:{col_sums}")
# 验证对角线之和
diag1_sum = sum(magic[i][i] for i in range(n)) # 主对角线
diag2_sum = sum(magic[i][n-1-i] for i in range(n)) # 副对角线
print(f"实际对角线之和:{diag1_sum}, {diag2_sum}")
三、运行结果(3 阶魔方阵)
plaintext
3阶魔方阵:
8 1 6
3 5 7
4 9 2
理论魔和:15
实际每行之和:[15, 15, 15]
实际每列之和:[15, 15, 15]
实际对角线之和:15, 15
四、扩展:5 阶魔方阵示例
只需修改 n=5,运行结果如下:
plaintext
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
理论魔和:65
实际每行之和:[65, 65, 65, 65, 65]
实际每列之和:[65, 65, 65, 65, 65]
实际对角线之和:65, 65
五、关键说明
- 魔和公式:对于 n 阶奇数魔方阵,魔和 = n×(n2+1)/2(由 1~n² 的总和 n2(n2+1)/2 除以 n 行推导)。
- 输入限制:代码仅支持奇数阶(3、5、7...),若需偶数阶魔方阵,需使用不同算法(如双偶数阶用 “对称交换法”,单偶数阶用 “分区合成法”)。
- 代码优化:通过列表推导式初始化矩阵,用格式化输出保证对齐,同时添加了输入校验和结果验证,确保正确性。