64,082
社区成员
发帖
与我相关
我的任务
分享
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;
}
};