1. 程式人生 > 其它 >Leetcode刷題筆記 959. 由斜槓劃分區域

Leetcode刷題筆記 959. 由斜槓劃分區域

技術標籤:leetcodeleetcode圖論並查集

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] 是 ‘/’、’’、或 ’ '。

解題思路

  1. 這是一道挺有意思的題,竟然是並查集的
  2. 把一個網格拆分成4塊三角形,對應0,1,2,3
  3. 如果grid中是 \ 說明第0和1塊是同一個連通 第2和3塊是同一個連通分量
  4. 如果grid中是 / 說明第0和3塊是同一個連通 第1和2塊是同一個連通分量
  5. 如果grid中是 空格 則這4塊三角形同屬於一個連通分量
  6. 這是一塊網格的情況 當幾個網格一起的時候
  7. 這一塊的 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的一天哦!