题目链接: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)