JZX轻语:简

LeetCode 1958 - 检查操作是否合法

发表于2024年07月07日

#枚举 #模拟

直接枚举八个方向,如果有一个方向满足要求,直接返回True即可。如何判断是否满足要求呢?先记目标颜色colorA,相反颜色为B,我们需要在至少一种方向的路径上满足AB..BA格式。从落点(rMove, cMove)出发,枚举八个方向,沿着方向一路检查,如果走出边界或者遇到空格,说明无法构成AB..BA的格式,不满足要求;如果遇到相反颜色,则判断B的个数是否大于等于1,如果是,则满足要求。

class Solution:
    moves = (
        (-1, -1), (-1, 0), (-1, 1),
        (0, -1), (0, 1),
        (1, -1), (1, 0), (1, 1)
    )

    def checkMove(self, board: List[List[str]], rMove: int, cMove: int, color: str) -> bool:
        n = len(board)
        legal = False
        for move in self.moves:
            r, c = rMove, cMove
            middle_cnt = 0
            while True:
                r, c = r + move[0], c + move[1]
                if r < 0 or r >= n or c < 0 or c >= n or board[r][c] == '.':
                    legal = False
                    break
                if board[r][c] != color:
                    middle_cnt += 1
                else:
                    legal = middle_cnt >= 1
                    break
            if legal:
                break
        return legal

闪念标签:LC

题目链接:https://leetcode.cn/problems/check-if-move-is-legal/