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/
Sure, I can help with that! Here's the implementation of the Sudoku class with the main() method, validLine() static method, and allLinesValid() static method: ```python class Sudoku: def main(self): # Declare a variable named grid corresponding to a sudoku grid grid = [ [5, 3, 4, 6, 7, 8, 9, 1, 2], [6, 7, 2, 1, 9, 5, 3, 4, 8], [1, 9, 8, 3, 4, 2, 5, 6, 7], [8, 5, 9, 7, 6, 1, 4, 2, 3], [4, 2, 6, 8, 5, 3, 7, 9, 1], [7, 1, 3, 9, 2, 4, 8, 5, 6], [9, 6, 1, 5, 3, 7, 2, 8, 4], [2, 8, 7, 4, 1, 9, 6, 3, 5], [3, 4, 5, 2, 8, 6, 1, 7, 9] ] # Check if the grid is valid print(self.isValid(grid)) @staticmethod def validLine(grid, i): # Check if the line i is valid (i.e. contains exactly once each value from 1 to 9) for j in range(1, 10): if grid[i].count(j) != 1: return False return True @staticmethod def allLinesValid(grid): # Check if all the lines are valid for i in range(0, 9): if not Sudoku.validLine(grid, i): return False return True def isValid(self, grid): # Check if the grid is valid (i.e. each line, column, and block contains exactly once each value from 1 to 9) for i in range(0, 9): # Check if the line i is valid if not Sudoku.validLine(grid, i): return False # Check if the column i is valid column = [grid[j][i] for j in range(0, 9)] if not Sudoku.validLine(column, 0): return False # Check if the block i is valid block = [] for j in range(0, 3): for k in range(0, 3): block.append(grid[(i // 3) * 3 + j][(i % 3) * 3 + k]) if not Sudoku.validLine(block, 0): return False return True ``` To test the implementation, you can create an instance of the Sudoku class and call the main() method: ```python sudoku = Sudoku() sudoku.main() ``` This will output True if the grid is valid, and False otherwise.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值