Leetcode 840. Magic Squares In Grid

Posted SnailTyan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode 840. Magic Squares In Grid相关的知识,希望对你有一定的参考价值。

文章作者:Tyan
博客:noahsnail.com  |  CSDN  |  简书

1. Description

Magic Squares In Grid

2. Solution

**解析:**根据三阶幻方的定义,一项项检查即可,满足条件+1。Version 1是针对3*3的,Version 2进行了一些修改,减少了代码量,Version 3是针对k*k的通用版本。

  • Version 1
class Solution:
    def numMagicSquaresInside(self, grid: List[List[int]]) -> int:
        rows = len(grid)
        columns = len(grid[0])
        count = 0
        for i in range(rows - 2):
            for j in range(columns - 2):
                if self.check(grid, i, j):
                    count += 1
        return count


    def check(self, grid, x, y):
        temp = set(grid[x][y:y+3] + grid[x+1][y:y+3] + grid[x+2][y:y+3])
        if len(temp) != 9:
            return False
        for i in range(x, x+3):
            for j in range(y, y+3):
                if grid[i][j] == 0 or grid[i][j] > 9:
                    return False
        x1 = sum(grid[x][y:y+3])
        x2 = sum(grid[x+1][y:y+3])
        if x2 != x1:
            return False
        x3 = sum(grid[x+2][y:y+3])
        if x3 != x1:
            return False
        x4 = grid[x][y] + grid[x+1][y] + grid[x+2][y]
        if x4 != x1:
            return False
        x5 = grid[x][y+1] + grid[x+1][y+1] + grid[x+2][y+1]
        if x5 != x1:
            return False
        x6 = grid[x][y+2] + grid[x+1][y+2] + grid[x+2][y+2]
        if x6 != x1:
            return False
        x7 = grid[x][y] + grid[x+1][y+1] + grid[x+2][y+2]
        if x7 != x1:
            return False
        x8 = grid[x][y+2] + grid[x+1][y+1] + grid[x+2][y]
        if x8 != x1:
            return False
        return True
  • Version 2
class Solution:
    def numMagicSquaresInside(self, grid: List[List[int]]) -> int:
        rows = len(grid)
        columns = len(grid[0])
        count = 0
        for i in range(rows - 2):
            for j in range(columns - 2):
                if self.check(grid, i, j):
                    count += 1
        return count


    def check(self, grid, x, y):
        temp = {i: 0 for i in range(1, 10)}
        for i in range(x, x+3):
            for j in range(y, y+3):
                if grid[i][j] not in temp or temp[grid[i][j]] == 1:
                    return False
                temp[grid[i][j]] = 1

        temp = grid[x][y] + grid[x+1][y+1] + grid[x+2][y+2]
        if temp != grid[x][y+2] + grid[x+1][y+1] + grid[x+2][y]:
            return False
        for i in range(3):
            if temp != sum(grid[x+i][y:y+3]):
                return False
            if temp != grid[x][y+i] + grid[x+1][y+i] + grid[x+2][y+i]:
                return False
        return True
  • Version 3
class Solution:
    def numMagicSquaresInside(self, grid: List[List[int]]) -> int:
        rows = len(grid)
        columns = len(grid[0])
        count = 0
        k = 3
        for i in range(rows-k+1):
            for j in range(columns-k+1):
                if self.check(grid, i, j, k):
                    count += 1
        return count


    def check(self, grid, x, y, k):
        temp = {i: 0 for i in range(1, k*k+1)}
        for i in range(x, x+k):
            for j in range(y, y+k):
                if grid[i][j] not in temp or temp[grid[i][j]] == 1:
                    return False
                temp[grid[i][j]] = 1

        main_diagonal = 0
        secondary_diagonal = 0
        for i in range(k):
            main_diagonal += grid[x+i][y+i]
            secondary_diagonal += grid[x+i][y+k-i-1]
        if main_diagonal != secondary_diagonal:
            return False
        for i in range(k):
            if main_diagonal != sum(grid[x+i][y:y+k]):
                return False
            if main_diagonal != sum([grid[x+j][y+i] for j in range(k)]):
                return False
        return True

Reference

  1. https://leetcode.com/problems/magic-squares-in-grid/

以上是关于Leetcode 840. Magic Squares In Grid的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 840. Magic Squares In Grid

840. Magic Squares In Grid ——weekly contest 86

840. Magic Squares In Grid

840. Magic Squares In Grid (5月27日)

LeetCode - Implement Magic Dictionary

[leetcode-676-Implement Magic Dictionary]