LeetCode-Python-840. 矩阵中的幻方

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. 1 <= grid.length <= 10
  2. 1 <= grid[0].length <= 10
  3. 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

猜你喜欢

转载自blog.csdn.net/qq_32424059/article/details/88673574