1. 题目解析:840. 矩阵中的幻方
幻方(Magic Square)是数学中一个经典问题,指在n×n的矩阵中填入1到n²的数字,使得每一行、每一列以及两条对角线上的数字之和都相等。题目"840. 矩阵中的幻方"要求我们识别给定3×3矩阵中所有可能的3阶幻方子矩阵。
3阶幻方有一些独特性质:
- 中心数字必定是5
- 四个角数字必定是偶数
- 四条边中间的数字必定是奇数
- 幻和(每行/列/对角线和)必定是15
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 幻方的数学原理
2.1 幻方的构造方法
对于3阶幻方,最著名的构造方法是Siamese方法(也称De la Loubère方法):
- 将1放在第一行中间列
- 后续数字放在当前数字的右上方格子
- 如果超出边界则从另一侧继续
- 如果目标格子已有数字,则放在当前数字正下方
python复制def generate_magic_square(n):
magic_square = [[0]*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, next_j = (i-1)%n, (j+1)%n
if magic_square[next_i][next_j]:
i = (i+1)%n
else:
i, j = next_i, next_j
return magic_square
2.2 幻方的验证条件
要验证一个3×3矩阵是否为幻方,需要检查以下条件:
- 包含1到9的所有不重复整数
- 每行和等于15
- 每列和等于15
- 两条对角线和等于15
3. 解题算法实现
3.1 暴力枚举法
最直接的方法是枚举所有可能的3×3子矩阵,然后验证是否为幻方:
python复制def numMagicSquaresInside(grid):
def is_magic(square):
nums = set()
for i in range(3):
for j in range(3):
if not 1 <= square[i][j] <= 9:
return False
nums.add(square[i][j])
if len(nums) != 9:
return False
target = 15
# 检查行
for row in square:
if sum(row) != target:
return F
