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 - 相同子树替换后最长重复子串多米诺骨牌

LeetCode 717. 1 比特与 2 比特字符 / 838. 推多米诺 / 1994. 好子集的数目(状态压缩动态规划)

leetcode中等838推多米诺

[LeetCode] Push Dominoes 推多米诺骨牌

20170929 校内模拟赛 多米诺骨牌

多米诺骨牌