1. 程式人生 > >Leetcode959. Regions Cut By Slashes由斜槓劃分區域

Leetcode959. Regions Cut By Slashes由斜槓劃分區域

在由 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. 1 <= grid.length == grid[0].length <= 30
  2. grid[i][j] 是 '/'、'\'、或 ' '。

 

思路轉換一下,然後再搜尋就可以了。

最開始是將大小 * 2,但是在{"//", "/ "};這個案列中就錯誤了,仔細想想為什麼。

然後換成 * 3的就可以了。

 

class Solution {
public:
    vector<vector<bool> > Map;
    vector<vector<bool> > Visit;
    int dx[4] = {1,-1,0,0};
    int dy[4] = {0,0,1,-1};
    int N;
    int regionsBySlashes(vector<string>& grid) 
    {
        N = grid.size();
        Map = vector<vector<bool> >(N * 3, vector<bool>(N * 3, false));
        Visit = vector<vector<bool> >(N * 3, vector<bool>(N * 3, false));
        int cntAns = 0;
        for(int i = 0; i < N; i++)
        {
            for(int j = 0; j < grid[i].size(); j++)
            {
                if(grid[i][j] == '\\')
                {
                    Map[3 * i][3 * j] = true;
                    Map[3 * i + 1][3 * j + 1] = true;
                    Map[3 * i + 2][3 * j + 2] = true;
                }
                else if(grid[i][j] == '/')
                {
                    Map[3 * i][3 * j + 2] = true;
                    Map[3 * i + 1][3 * j + 1] = true;
                    Map[3 * i + 2][3 * j] = true;
                }
            }
        }
        /*
        for(int i = 0; i < 3 * N; i++)
        {
            for(int j = 0; j < 3 * N; j++)
            {
                cout << Map[i][j] << (j == 3 * N - 1? '\n' : ' ');
            }
        }
        //*/
        for(int i = 0; i < 3 * N; i++)
        {
            for(int j = 0; j < 3 * N; j++)
            {
                if(Map[i][j] == false && Visit[i][j] == false)
                {
                    cntAns++;
                    BFS(i , j);
                }
            }
        }
        return cntAns;
    }

    void BFS(int x, int y)
    {
        queue<pair<int, int> > q;
        q.push(make_pair(x, y));
        Visit[x][y] = true;
        while(!q.empty())
        {
            int i = q.front().first;
            int j = q.front().second;
            q.pop();
            for(int k = 0; k < 4; k++)
            {
                int ii = i + dx[k];
                int jj = j + dy[k];
                if(ii < 0 || ii >= 3 * N || jj < 0 || jj >= 3 * N)
                    continue;
                if(Visit[ii][jj] == true || Map[ii][jj] == true)
                    continue;
                Visit[ii][jj] = true;
                q.push(make_pair(ii, jj));
            }
        }
    }
};

 

方法二:

並查集(未想出,帶更新)