《七月集训》第二十七天 图

Crazy_DM 2022-07-27 21:52:48

959.由斜杠划分的正方形区域

解题思路:

1.每个1×1的正方形可以被划分成0,1,2,3三个区域。\ 的时候,0和2合并,1和3合并。/的时候,0和1合并,2和3合并。若没有任何斜杠,0,1,2,3合并。

3.在划分区域之前,正方形先和隔壁的区域连通。有上下左右四个方向

2.统计连通分量,++计数器

class Solution {
#define maxn 100010
int fa[maxn];
unordered_map<int, int> linkArea;
    void init(int size) {
        for(int i = 0; i < size; ++i) {
            fa[i] = i;
        }
    }
    int find(int x) {
        return fa[x] == x ? x : (fa[x] = find(fa[x]));
    }
    void merge(int i, int j) {
        int fi = find(i), fj = find(j);

        if(fi == fj) //同一个连通分量
            return ;
        else {
            fa[fi] = fj;
        }
    }
    int dir[4][2] = {
        {-1, 0},
        {0, -1},
        {0, 1},
        {1, 0}
    };
public:
    int regionsBySlashes(vector<string>& grid) {
        int n = grid.size();
        int cnt = 0;
        init(4*n*n);

        for(int i = 0; i < grid.size(); ++i) { 
            for(int j = 0; j < grid[i].size(); ++j) {
                int base = n * i + j;
                char c = grid[i][j];
                //需要和上下左右合并
                for(int k = 0; k < 4; ++k) {
                    int LR = j + dir[k][0];//left and right
                    int UD = i + dir[k][1];//up and down

                    if(LR < 0 || UD < 0 || LR == n || UD == n) continue;
                    int neighbor = UD * n + LR; 
                    merge(4 * base + k, 4 * neighbor + 3 - k);
                }
                if(c == '\\') {
                    merge(4 * base, 4 * base + 2);
                    merge(4 * base + 1, 4 * base + 3);
                }
                else if(c == '/') {
                    merge(4 * base + 2, 4 * base + 3);
                    merge(4 * base, 4 * base + 1);
                }
                else {//方格都需要合并
                    merge(4 * base, 4 * base + 2);
                    merge(4 * base, 4 * base + 1);
                    merge(4 * base + 2, 4 * base + 3);
                }
            }
        }

        for(int i = 0; i < 4 * n * n; ++i) {
            int faNum = find(i);
            if(linkArea[faNum] == 0) {
                linkArea[faNum] = 1;
                ++cnt;
            }
        }
        return cnt;
    }
};

 

...全文
18 回复 打赏 收藏 举报
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复
发帖
万人千题

6.2w+

社区成员

学习「 算法 」的捷径就是 「 题海战略 」,社区由「 夜深人静写算法 」作者创建,三年ACM经验,校集训队队长,亚洲区域赛金牌,世界总决赛选手。社区提供系统的训练,答疑解惑,面试经验,大厂内推等机会
社区管理员
  • 英雄哪里出来
  • Amy卜bo皮
  • Risso
加入社区
帖子事件
创建了帖子
2022-07-27 21:52
社区公告

QQ群:480072171

英雄算法交流 8 群