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



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 題目講解匯總(持續更新中...)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM