Leetcode刷題筆記 959. 由斜槓劃分區域
阿新 • • 發佈:2021-01-27
959. 由斜槓劃分區域
知識點:並查集
時間:2021年1月25日
題目連結
題目
在由 1 x 1 方格組成的 N x N 網格 grid 中,每個 1 x 1 方塊由 /、\ 或空格構成。這些字元會將方塊劃分為一些共邊的區域。
請注意,反斜槓字元是轉義的,因此 \ 用 “\” 表示。)。
返回區域的數目。
示例 1:
輸入:
[
" /",
"/ "
]
輸出:2
解釋:2x2 網格如下:
示例 2:
輸入:
[
" /",
" "
]
輸出:1
解釋:2x2 網格如下:
示例 3:
輸入:
[
"\\/",
"/\\"
]
輸出:4
解釋:(回想一下,因為 \ 字元是轉義的,所以 “\/” 表示 /,而 “/\” 表示 /\。)
2x2 網格如下:
示例 4:
輸入:
[
"/\\",
"\\/"
]
輸出:5
解釋:(回想一下,因為 \ 字元是轉義的,所以 “/\” 表示 /\,而 “\/” 表示 /。)
2x2 網格如下:
示例 5:
輸入:
[
"//",
"/ "
]
輸出:3
解釋:2x2 網格如下:
提示:
- 1 <= grid.length == grid[0].length <= 30
- grid[i][j] 是 ‘/’、’’、或 ’ '。
解題思路
- 這是一道挺有意思的題,竟然是並查集的
- 把一個網格拆分成4塊三角形,對應0,1,2,3
- 如果grid中是 \ 說明第0和1塊是同一個連通 第2和3塊是同一個連通分量
- 如果grid中是 / 說明第0和3塊是同一個連通 第1和2塊是同一個連通分量
- 如果grid中是 空格 則這4塊三角形同屬於一個連通分量
- 這是一塊網格的情況 當幾個網格一起的時候
- 這一塊的 1號位和右邊一塊的3號位相連通 2號位和下一塊的0號位相連通
程式碼
#include "cheader.h"
class Solution {
public:
struct UN{
vector<int> ancestor;
UN(int x){
ancestor.resize(x);
for(int i = 0; i < x;i++)
ancestor[i] = i;
}
int find(int x){
if(ancestor[x] == x)
return x;
else
return ancestor[x] = find(ancestor[x]);
}
void merge(int x,int y){
ancestor[find(x)] = ancestor[find(y)];
}
};
int regionsBySlashes(vector<string>& grid) {
int n = grid.size() ;
UN un = UN(n*n*4);
for(int i = 0 ;i < n; i++){
for(int j = 0; j < n; j++){
int index = i * n + j;
//這塊的2號位和下一塊的0號位相連通
if(i < n-1){
int bottom = index + n;
un.merge(index*4+2, bottom*4);
}
//這塊的1號位和右邊那塊的3號位連通
if(j < n-1){
int right = index +1;
un.merge(index*4+1, right*4+3);
}
if(grid[i][j] == '/'){
un.merge(index*4, index*4+3);
un.merge(index*4+1, index*4+2);
}
if(grid[i][j] == '\\'){
un.merge(index*4, index*4+1);
un.merge(index*4+2, index*4+3);
}
if(grid[i][j] == ' '){
un.merge(index*4, index*4+1);
un.merge(index*4+1, index*4+2);
un.merge(index*4+2, index*4+3);
}
}
}
int ans = 0;
for(int i = 0; i < n*n*4 ; i++){
if(un.find(i) == i)
ans++;
}
return ans;
}
};
int main()
{
vector<string> grid;
grid.push_back({" /"});
grid.push_back({" "});
Solution s;
cout<<s.regionsBySlashes(grid)<<endl;
return 0;
}
今天也是愛zz的一天哦!