力扣(leetcode)#959 由斜杠划分区域(#3)

题目

原题链接:力扣(LeetCode)#1319

解析

依然是并查集维护连通分量的问题,本题主要难点在于如何划分连通分量。

力扣(leetcode)#959 由斜杠划分区域(#3)_第1张图片
将每一个1*1的小方格都按照这个模式进行划分:

  1. 如果grid[i][j]=‘\\’,那么是1和2进行合并,0和3进行合并
  2. 如果grid[i][j]=‘/’,那么是0和1进行合并,2和3进行合并
  3. 如果grid[i][j]=‘ ’,那么是0,1,2,3合并

上面是三种内部合并的情况讨论。
接下来讨论小方格之间的合并问题:

  • 对于2号区域可以和右边一个小方格的0号区域进行合并
  • 对于3号区域可以和下边一个小方格的1号区域进行合并

到此,分析结束,将并查集的模板写完之后,根据上述分析过程进行合并即可。

代码

class Solution {
     
private: 
    int cnt;
    vector<int> a;
public:
    int regionsBySlashes(vector<string>& grid) {
     
        int n=grid.size();
        cnt=4*n*n;
        init(cnt);
        for(int i=0;i<n;i++)
        {
     
            for(int j=0;j<n;j++)
            {
     
                if(grid[i][j]=='/')
                {
     
                    merge(a[4*n*i+4*j],a[4*n*i+4*j+1]);
                    merge(a[4*n*i+4*j+2],a[4*n*i+4*j+3]);
                }
                else if(grid[i][j]=='\\'){
     
                    merge(a[4*n*i+4*j],a[4*n*i+4*j+3]);
                    merge(a[4*n*i+4*j+1],a[4*n*i+4*j+2]);
                }
                else{
     
                    merge(a[4*n*i+4*j],a[4*n*i+4*j+3]);
                    merge(a[4*n*i+4*j+1],a[4*n*i+4*j+2]);
                    merge(a[4*n*i+4*j],a[4*n*i+4*j+1]);
                }
                if(j<n-1)
                {
     
                    merge(a[4*n*i+4*j+2],a[4*n*i+4*(j+1)]);
                }
                if(i<n-1)
                    merge(a[4*n*i+4*j+3],a[4*n*(i+1)+4*j+1]);
            }
        }
        return cnt;
    }
    void init(int n)
    {
     
        for(int i=0;i<n;i++)
            a.push_back(i);
    }

    int find(int var)
    {
     
        if(var==a[var])
            return var;
        else
            return a[var]=find(a[var]);
    }

    void merge(int x, int y)
    {
     
        int a1=find(x);
        int a2=find(y);
        if(a1!=a2)
        {
     
            a[a1]=a2;
            cnt--;
        }       
    }
};

结果

力扣(leetcode)#959 由斜杠划分区域(#3)_第2张图片

你可能感兴趣的:(leetcode练习,leetcode,c++,算法,图论)