leetcode_959. 由斜杠划分区域

举报
悲恋花丶无心之人 发表于 2021/02/02 23:39:55 2021/02/02
【摘要】 目录 一、题目内容 二、解题思路 三、代码 一、题目内容 在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /、\ 或空格构成。这些字符会将方块划分为一些共边的区域。 (请注意,反斜杠字符是转义的,因此 \ 用 "\\" 表示。)。 返回区域的数目。 示例 1: 输入...

目录

一、题目内容

二、解题思路

三、代码


一、题目内容

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

二、解题思路

三角形由三个边构成,那么三个点两两都连通则区域加1。

首先先将大格子的边上的点进行连通,然后再处理斜线‘/’上的点,连通则区域加1,不连通则将两个点进行连通,接着同样处理‘\',说白了就是三角形的顶点到达另一个顶点既可以直接通过相连的线段到达,也可以经过除二者之外的另一个顶点再到达。

总之连通就是这个意思~

三、代码


  
  1. from collections import defaultdict
  2. class Solution:
  3. def regionsBySlashes(self, grid: list) -> int:
  4. root = defaultdict(tuple)
  5. def find(x):
  6. if x != root[x]:
  7. root[x] = find(root[x])
  8. # return root[x]
  9. return root[x]
  10. # 检测x和y是否连通
  11. def connected(x, y):
  12. return find(x) == find(y)
  13. # 连通x和y
  14. def union(x, y):
  15. if connected(x, y) is False:
  16. root[find(x)] = find(y)
  17. # 存储大格子所有点坐标
  18. for i in range(len(grid) + 1):
  19. for j in range(len(grid) + 1):
  20. root[(i, j)] = (i, j)
  21. # 左斜上三角的点进行连通
  22. for i in range(len(grid) + 1):
  23. union((0, 0), (0, i))
  24. union((0, 0), (i, 0))
  25. # 右斜下三角的点进行连通
  26. for i in range(len(grid) + 1):
  27. union((i, len(grid)), (len(grid), len(grid)))
  28. union((len(grid), i), (len(grid), len(grid)))
  29. # 这样大格子边上的点都进行了连通
  30. res = 1 # 连通区域个数
  31. for i in range(len(grid)):
  32. for j in range(len(grid)):
  33. if grid[i][j] == '/':
  34. # 小格子的左下角和右上角之前已经连通了
  35. if connected((i + 1, j), (i, j + 1)):
  36. res += 1 # 个数加1
  37. else:
  38. # 否则小格子的左下角和右上角进行连通
  39. union((i + 1, j), (i, j + 1))
  40. elif grid[i][j] == '\\':
  41. # 小格子的左上角和右下角之前已经连通了
  42. if connected((i, j), (i + 1, j + 1)):
  43. res += 1 # 个数加1
  44. else:
  45. # 否则小格子的左上角和右下角进行连通
  46. union((i, j), (i + 1, j + 1))
  47. return res
  48. if __name__ == '__main__':
  49. grid = [
  50. "/\\",
  51. "\\/"
  52. ]
  53. s = Solution()
  54. ans = s.regionsBySlashes(grid)
  55. print(ans)

文章来源: nickhuang1996.blog.csdn.net,作者:悲恋花丶无心之人,版权归原作者所有,如需转载,请联系作者。

原文链接:nickhuang1996.blog.csdn.net/article/details/113104613

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。