840. 矩阵中的幻方 - 力扣(Leetcode)https://leetcode.cn/problems/magic-squares-in-grid/description/
根据幻方的定义,暴力就好
首先怎么去判断9宫格里的数字是否是1-9呢?
答:将这9宫格的数字放到列表中,对其排序,看是否等于list(range(1,10))就好。
在暴力的基础上能不能优化呢?
能,
网格的总和是 45,因为网格必须是 1 到 9 不同的数字。
每一列和行加起来必须是 15,乘以 3 则是网格的总和。
对角线的和也必须是 15,题目中说了对角线与列,行的和相同。
将四条穿过中心的线的 12 个值相加(即一行一列两条对角线),这四条线加起来等于 60;而整个网格加起来为 45。则中心等于 (60−45)/3=5(60-45)/3 = 5(60−45)/3=5。
class Solution:
def numMagicSquaresInside(self, grid):
row=len(grid)
col=len(grid[0])
ans=0
def judge(a,b,c,d,e,f,g,h,i):
ls=[a,b,c,d,e,f,g,h,i]
ls.sort()
return (ls==list(range(1,10)) and (a+b+c==d+e+f==g+h+i== a+d+g ==b+e+h == c+f+i == a+e+i == c+e+g == 15))
for i in range(row-2):
for j in range(col-2):
if grid[i+1][j+1]!=5:
continue
else:
if judge(grid[i][j],grid[i][j+1],grid[i][j+2],
grid[i+1][j],grid[i+1][j+1],grid[i+1][j+2],
grid[i+2][j],grid[i+2][j+1],grid[i+2][j+2]):
ans+=1
return ans
矩阵中连双等的含义
”5== len(a)== len(b)“等价于”5== len(a) and len(a)==len(b)“