LC 3235. 判断矩形的两个角落是否可达
https://leetcode.cn/problems/check-if-the-rectangle-corner-is-reachable/description/
这题看了题解大致知道是什么意思了:整个过程分为两步:
- 先对圆检查对矩形的左上半部分和右下半部分进行覆盖检查。
- 然后检查每个圆之间的连接情况
- 如果最后发现上半部分和下半部分之间出现连接的话,那么认为是没有办法穿越过来的。
class Solution:
def canReachCorner(self, X: int, Y: int, circles: List[List[int]]) -> bool:
n = len(circles)
uf = [-1] * (n + 2)
def find(x):
while uf[x] != -1:
x = uf[x]
res = x
while uf[x] != -1:
r = uf[x]
uf[x] = res
x = r
return res
def merge(a, b):
a, b = find(a), find(b)
if a != b:
uf[a] = b
for i in range(n):
ox, oy, r = circles[i]
if ox - r <= 0 or oy + r >= Y:
merge(i, n)
if ox + r >= X or oy - r <= 0:
merge(i, n + 1)
for j in range(i):
x2, y2, r2 = circles[j]
if (ox - x2) ** 2 + (oy - y2) ** 2 <= (r + r2) ** 2:
merge(i, j)
if find(n) == find(n + 1):
return False
return True