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] 是 ‘/’、’’、或 ’ '。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/regions-cut-by-slashes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析及代码实现

这道题也是一个完全的并查集,根据题目和例子,可以分析出1x1的方格,被/,\划分成了四部分:
上侧是0,右侧是1,下侧是2,左侧是3
1.如果是“/”,可以两两合并
2.如果是“\”,也可以两两合并
3.如果是空,那么四个一起合并
这是在一个格子里的情况,还有相邻的两个格子之间,包括左侧格子的右侧和右侧格子的左侧是相连的,当前格子的下侧与下侧格子的上侧是相连的
这样我们就可以写出代码

'''并查集部分'''
class DSU:
    def __init__(self,n):
        self.father = [i for i in range(4*n*n)]

    def find(self, x):
        if x != self.father[x]:
            self.father[x] = self.find(self.father[x])
        return self.father[x]

    def union(self, a, b):
        x = self.find(a)
        y = self.find(b)
        if x != y:
            self.father[x] = y
    
class Solution:
    def regionsBySlashes(self, grid: List[str]) -> int:
        n = len(grid)
        dsu = DSU(n)
        for i in range(n):
            for j in range(n):
                start = 4 * (i * n + j)
                if grid[i][j] == "/":
                    dsu.union(start+0, start+3)
                    dsu.union(start+1, start+2)
                elif grid[i][j] == "\\":
                    dsu.union(start+0, start+1)
                    dsu.union(start+2, start+3)
                else:
                    dsu.union(start+0, start+1)
                    dsu.union(start+0, start+2)
                    dsu.union(start+0, start+3)
                if i < n - 1:
                    dsu.union(start + 2, start + n * 4)
                if j < n - 1:
                    dsu.union(start + 1, start + 7)
        dsu_set = set()
        for i in range(4 * n ** 2):
            dsu_set.add(dsu.find(i))
        return len(dsu_set)
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会写代码的嘤嘤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值