leetcode_959. 由斜杠划分区域

目录

一、题目内容

二、解题思路

三、代码


一、题目内容

在由 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

(完)