838. 推多米诺(bfs&模拟)
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了838. 推多米诺(bfs&模拟)相关的知识,希望对你有一定的参考价值。
838. 推多米诺(bfs&模拟)
每个位置的情况只取决于该时刻左和右骨牌的情况。
我们可以bfs,初始加入所有非.
骨牌,然后模拟即可。
class Solution
public:
string pushDominoes(string a)
int n = a.size();
vector<int>vis(n,-1);
vector<vector<char> >f(n);
queue<int>q;
string ans(n,'.');
for(int i=0;i<n;i++)
char ch = a[i];
if(ch!='.')
vis[i] = 0;
q.push(i);
f[i].push_back(ch);
while(!q.empty())
int u = q.front();q.pop();
if(f[u].size() == 1)
char ch = f[u][0];
ans[u] = ch;
int p = (ch=='L')?u-1:u+1;
if(p>=0 && p<n)
int t = vis[u];
if(vis[p]==-1)
vis[p] = t+1;
f[p].push_back(ch);
q.push(p);
else if(vis[p]==t+1) f[p].push_back(ch);
return ans;
;
事实上,我们可以进行模拟,对连续一段.
进行判断,这段的结果只取决于两端的情况,使用双指针即可。
class Solution
public:
string pushDominoes(string dominoes)
int n = dominoes.size(), i = 0;
char left = 'L';
while (i < n)
int j = i;
while (j < n && dominoes[j] == '.') // 找到一段连续的没有被推动的骨牌
j++;
char right = j < n ? dominoes[j] : 'R';
if (left == right) // 方向相同,那么这些竖立骨牌也会倒向同一方向
while (i < j)
dominoes[i++] = right;
else if (left == 'R' && right == 'L') // 方向相对,那么就从两侧向中间倒
int k = j - 1;
while (i < k)
dominoes[i++] = 'R';
dominoes[k--] = 'L';
left = right;
i = j + 1;
return dominoes;
;
以上是关于838. 推多米诺(bfs&模拟)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 717. 1 比特与 2 比特字符 / 838. 推多米诺 / 1994. 好子集的数目(状态压缩动态规划)