暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[LeetCode] 959. Regions Cut By Slashes 由斜杠划分区域

刷尽天下 2020-11-09
394


In a N x N grid
 composed of 1 x 1 squares, each 1 x 1 square consists of a /
, \
, or blank space.  These characters divide the square into contiguous regions.

(Note that backslash characters are escaped, so a \
 is represented as "\\"
.)

Return the number of regions.

Example 1:

Input: [
  " /",
  "/ "
]
Output: 2
Explanation: The 2x2 grid is as follows:

Example 2:

Input: [
  " /",
  " "
]
Output: 1
Explanation: The 2x2 grid is as follows:


Example 3:

Input: [
  "\\/",
  "/\\"
]
Output: 4
Explanation: (Recall that because \ characters are escaped, "\\/" refers to \/, and "/\\" refers to /\.)
The 2x2 grid is as follows:


Example 4:

Input: [
  "/\\",
  "\\/"
]
Output: 5
Explanation: (Recall that because \ characters are escaped, "/\\" refers to /\, and "\\/" refers to \/.)
The 2x2 grid is as follows:


Example 5:

Input: [
  "//",
  "/ "
]
Output: 3
Explanation: The 2x2 grid is as follows:


Note:

  1. 1<=grid.length==grid[0].length<=30

  2. grid[i][j]
     is either '/'
    '\'
    , or ' '
    .


这道题说是有个 NxN 个小方块,每个小方块里可能是斜杠,反斜杠,或者是空格。然后问这些斜杠能将整个区域划分成多少个小区域。这的确是一道很有意思的题目,虽然只是 Medium 的难度,但是博主拿到题目的时候是懵逼的,这尼玛怎么做?无奈只好去论坛上看大神们的解法,结果发现大神们果然牛b,巧妙的将这道题转化为了岛屿个数问题 Number of Islands,具体的做法将每个小区间化为九个小格子,这样斜杠或者反斜杠就是对角线或者逆对角线了,是不是有点图像像素化的感觉,就是当你把某个图片尽可能的放大后,到最后你看到也就是一个个不同颜色的小格子组成了这幅图片。这样只要把斜杠的位置都标记为1,而空白的位置都标记为0,这样只要找出分隔开的0的群组的个数就可以了,就是岛屿个数的问题啦。使用一个 DFS 来遍历即可,这个并不难,这道题难就难在需要想出来这种像素化得转化,确实需要灵光一现啊,参见代码如下:

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


类似题目:

Number of Islands


Github 同步地址:

https://github.com/grandyang/leetcode/issues/959


参考资料:

https://leetcode.com/problems/regions-cut-by-slashes/

https://leetcode.com/problems/regions-cut-by-slashes/discuss/205674/C%2B%2B-with-picture-DFS-on-upscaled-grid

https://leetcode.com/problems/regions-cut-by-slashes/discuss/205680/JavaC%2B%2BPython-Split-4-parts-and-Union-Find


LeetCode All in One 题目讲解汇总(持续更新中...)

文章转载自刷尽天下,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论