95 由斜杠划分区域(959)

作者: Turbo时间限制: 1S章节: 其它

晚于: 2020-09-09 12:00:00后提交分数乘系数50%

问题描述 :

在由 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 网格如下:

可使用如下main函数:

int main()

{

    int n;

    vector<string> grid;

    string line;

    cin>>n;

    cin.get();

    for(int i=0; i<n; i++)

    {

        getline(cin,line);

        grid.push_back(line);

    }

    int res=Solution().regionsBySlashes(grid) ;

    cout<<res;

}

输入说明 :

首先输入网格的大小N,1 <= N <= 30

然后输入N行,每行N个字符,每个字符是 '/'、'\'、或 ' '。

输出说明 :

输出结果

输入范例 :

输出范例 :

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
class Solution {
public:
    vector<int> f;

    int find(int x) {
        return x==f[x] ? x : f[x]=find(f[x]);
    }

    int merge(int u, int v) {
        int fu = find(u), fv = find(v);
        if (fu == fv) return 0;
        f[fv] = fu;
        return 1;
    }

    int regionsBySlashes(vector<string>& grid) {
        int n = grid.size();
        f = vector<int>((n+1)*(n+1), 0);
        for (int i = 0; i < (n+1)*(n+1); ++i) {
            f[i] = i;
        }
        for (int i = 0; i < n; ++i) {
            merge(i, i+1);
            merge(n*(n+1)+i, n*(n+1)+i+1);
            merge(i*(n+1), (i+1)*(n+1));
            merge(i*(n+1)+n, (i+1)*(n+1)+n);
        }
        int cnt = 1;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] == ' ') continue;
                int u, v;
                if (grid[i][j] == '/') {
                    u = i*(n+1)+j+1;
                    v = (i+1)*(n+1)+j;
                } else {
                    u = i*(n+1)+j;
                    v = (i+1)*(n+1)+j+1;
                }
                if (!merge(u, v)) cnt++;
            }
        }
        return cnt;
    }
};
int main()
{
    int n;
    vector<string> grid;
    string line;
    cin>>n;
    cin.get();
    for(int i=0; i<n; i++)
    {
        getline(cin,line);
        grid.push_back(line);
    }
    int res=Solution().regionsBySlashes(grid) ;
    cout<<res;
}
//https://leetcode-cn.com/problems/regions-cut-by-slashes/solution/c-cha-bing-ji-by-ekulelu-3/
//https://leetcode-cn.com/problems/regions-cut-by-slashes/solution/c-bing-cha-ji-tong-guo-xie-gang-liang-ding-dian-sh/

 

posted on 2020-09-15 21:12  Hi!Superman  阅读(186)  评论(0编辑  收藏  举报

导航