838. 推多米诺

exiaohu 于 2022-02-21 发布

题目链接:838. 推多米诺

广度优先搜索,从最开始推倒的骨牌开始,一层一层搜,模拟整个过程。

class Solution:
    def pushDominoes(self, dominoes: str) -> str:
        states, dominoes = [], list(dominoes)
        for i, d in enumerate(dominoes):
            if d != '.':
                states.append(i)

        while states:
            next_states, actions = [], []
            for i in states:
                if dominoes[i] == 'L':
                    if i - 1 < 0 or dominoes[i - 1] != '.':
                        continue
                    if (i - 2 >= 0 and dominoes[i - 2]) != 'R' or i == 1:
                        actions.append((i - 1, 'L'))
                        next_states.append(i - 1)
                elif dominoes[i] == 'R':
                    if i + 1 >= len(dominoes) or dominoes[i + 1] != '.':
                        continue
                    if (i + 2 < len(dominoes) and dominoes[i + 2] != 'L') or i + 2 == len(dominoes):
                        actions.append((i + 1, 'R'))
                        next_states.append(i + 1)

            for i, v in actions:
                dominoes[i] = v
            states = next_states

        return ''.join(dominoes)