3 x 3 的幻方是一个填充有从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。
给定一个由整数组成的 grid
,其中有多少个 3 × 3 的 “幻方” 子矩阵?(每个子矩阵都是连续的)。
示例:
输入: [[4,3,8,4], [9,5,1,9], [2,7,6,2]] 输出: 1 解释: 下面的子矩阵是一个 3 x 3 的幻方: 438 951 276 而这一个不是: 384 519 762 总的来说,在本示例所给定的矩阵中只有一个 3 x 3 的幻方子矩阵。
提示:
1 <= grid.length <= 10
1 <= grid[0].length <= 10
0 <= grid[i][j] <= 15
思路:
找到所有的子矩阵,然后检查是否满足条件。
class Solution(object):
def numMagicSquaresInside(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
#以左上角为00 ,构建子矩阵
# x 范围 0 ~ m - 2, y范围0 ~ n - 2
m,n = len(grid), len(grid[0])
if m < 3 or n < 3: # corner case
return 0
res = 0
for x in range(0, m - 2):
for y in range(0, n - 2):
# print grid[x][y]
tempmatrix = []
tempmatrix.append(grid[x][y:y + 3])
tempmatrix.append(grid[x + 1][y : y + 3])
tempmatrix.append(grid[x + 2][y : y + 3])
if self.check(tempmatrix):
res += 1
return res
def check(self, ma):
#----------检查条件1-9
digit = 0 for i in range(0, 10)]
for row in ma:
for d in row:
if d > 9:
return False
digit[d] = 0
for i in range(1, 10):
if digit[i] != 0:
return False
#----检查每一行
s = sum(ma[0])
for i in range(1, 3):
if sum(ma[i]) != s:
return False
#---检查对角线
sdia = 0
for i in range(0, 3):
sdia +=ma[i][i]
if sdia != s:
return False
sdia -= ma[2][0] + ma[1][1] + ma[0][2]
if sdia != 0:
return False
#---检查每一列
for j in range(0, 3):
sc = 0
for i in range(0,3):
sc += ma[i][j]
if sc != s:
return False
return True