链接:959. 由斜杠划分区域

题解:

为了解决本题,我们把 一个格子 划分成 4 个区域。如果是 左划线 "/",即对应了下图的 0️⃣ 和 ③ 连通、① 和 ② 连通;如果是 右划线 "\\",即对应了下图的 0️⃣ 和 ① 连通、③ 和 ② 连通;如果格子内没有线 " ",则 4 个区域都连通。

对于相邻的格子,有两种情况,一种是左右相邻,一种是上下相邻。

1. 左右相邻的两个格子,是左边格子的 ① 和右边格子的 ③ 连通。

2. 上下相邻的两个格子,是上边格子的 ② 和下边格子的 0️⃣ 相邻。

经过上面的这么多分析,我们终于有了解题思路:遍历每个格子,判断这个格子内的连通方式,并且判断这个格子和其上边、左边格子的连通方式。

class Solution {private:vector<int> _rank;vector<int> _id;public://  \0/1 \0/1// 3/2\ 3/2\//  \0/1// 3/2\int find(int p) {while(_id[p] != p) {_id[p] = _id[_id[p]];p = _id[p];}return p;}void union_find(int p, int q) {int root_p = find(p);int root_q = find(q);if(root_p == root_q) {return;}if(_rank[root_p] < _rank[root_q]) {_id[root_p] = root_q;} else if(_rank[root_q] < _rank[root_p]) {_id[root_q] = root_p;} else {_id[root_p] = root_q;_rank[root_q] += 1;}}int get_size() {int cnt = 0;for(int i = 0; i < _id.size(); ++i) {if(i == _id[i]) {++cnt;}}return cnt;}int regionsBySlashes(vector<string>& grid) {_rank.resize(4*grid.size()*grid.size(), 1);_id.resize(4*grid.size()*grid.size());for(int i = 0; i < 4*grid.size()*grid.size(); ++i) {_id[i] = i;}for(int i = 0; i < grid.size(); ++i) {for(int j = 0; j < grid[i].size(); ++j) {const char& c = grid[i][j];int n = grid.size();int val_0 = 4*(i*n+j);int val_1 = 4*(i*n+j)+1;int val_2 = 4*(i*n+j)+2;int val_3 = 4*(i*n+j)+3;if(c == '\\') {union_find(val_0, val_1);union_find(val_2, val_3);} else if(c == '/') {union_find(val_0, val_3);union_find(val_1, val_2);} else {union_find(val_0, val_1);union_find(val_1, val_2);union_find(val_2, val_3);}if(i+1 < n) {union_find(val_2, 4*((i+1)*n+j));}if(j+1 < n) {union_find(val_1, 4*(i*n+j+1)+3);}}}return get_size();}
};

959. 由斜杠划分区域相关推荐

  1. 【每日一题】 959. 由斜杠划分区域

    [每日一题] 959. 由斜杠划分区域 避免每日太过咸鱼,一天搞定一道LeetCode算法题 一.题目描述 在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /. ...

  2. leetcode 959. 由斜杠划分区域(并查集)

    在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /.\ 或空格构成.这些字符会将方块划分为一些共边的区域. (请注意,反斜杠字符是转义的,因此 \ 用 &quo ...

  3. leetcode —— 959. 由斜杠划分区域

    在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /.\ 或空格构成.这些字符会将方块划分为一些共边的区域. (请注意,反斜杠字符是转义的,因此 \ 用 &quo ...

  4. 并查集 - 由斜杠划分区域

    题目链接 求划分区域的个数,也就是求连通分量的个数,将每个单元格划分为4个部分,分别根据空格.斜杠.反斜杠进行合并. 单元格之间也要合并,上下.左右各选一个方向即可. class UnionFind{ ...

  5. 每日一题:leetcode959.由斜杠划分区域

    题目描述 题目分析 仔细分析这道题以后虽然觉得可能要转化为图之类的,但是完全没有具体的想法,因为每个格子都有三种情况,这三种情况的不同的组合又会产生不同的结果. 发现找不到编码转化为图以后,我分析了一 ...

  6. mybatis转义反斜杠_mybatis like 的坑

    昨天快要下班的时候组长交代了一个任务,说起来很简单,是这样的: 系统里面有一个字段为name,这个name允许设置为特殊字符,目前根据name模糊匹配,如果遇到特殊字符 比如 "$" ...

  7. 使用java中replaceAll方法替换字符串中的反斜杠

    今天在项目中使用java中replaceAll方法将字符串中的反斜杠("\")替换成空字符串(""),结果出现如下的异常: 1 java.util.regex. ...

  8. vim替换字符串带斜杠_Vim、gvim操作替换

    ~  回复 以下关键词  查看更多IC设计教程 ~ 目前支持的关键词有: Innovus                            ICC or IC CompilerDC or Desi ...

  9. 就是一个斜杠的事情!

    就在路径之后多添加了一个斜杠! 对比:

最新文章

  1. 如何将FPGA资源平民化?阿里工程师有了新突破
  2. 课程表—leetcode207
  3. 获取Spring中的bean,使得线程安全性得到保障
  4. Python学习——import语句导入模块顺序
  5. gdal库对ENVI文件的一点支持不好
  6. TalkingData的Spark On Kubernetes实践
  7. 【codevs1039】01年noip TG--数的划分满分dp+愚蠢深搜+pas的奇怪做法
  8. .net知识和学习方法系列(二十三)嵌套类
  9. Atitit 软件国际化原理与概论
  10. CV控制输出的图片大小
  11. GB2312编码规则与代码实现
  12. Verilog 练习 7段数码管译码器
  13. 三体和银河帝国基地孰优孰劣?
  14. Android VideoView播放 项目中的 视频文件 自动横屏 全屏播放
  15. 5.系统设计的工作内容与技能工具有哪些?
  16. XUPT 寒假算法集训第一周
  17. BGP进阶:BGP 综合实验一
  18. 维特比算法C++实现
  19. 揭秘换肤技术(转载)
  20. sqlserver 字段类型详解

热门文章

  1. 订单中有订单详细实体类。保存订单
  2. [翻译] InstagramPhotoPicker
  3. 在centos 6.5下安装svn (Subversion)
  4. Apache 及 Nginx 配置
  5. [Everyday Mathematics]20150225
  6. 企业运维之域控篇(三)--加入域
  7. 取得textarea中行的三种写法
  8. Go 单元测试从 0 到 1
  9. curl传post数据流
  10. Angular2 管道