首页 > 其他分享 >力扣21 打卡16 判断矩形的两个角落是否可达

力扣21 打卡16 判断矩形的两个角落是否可达

时间:2024-11-08 12:17:09浏览次数:7  
标签:return 21 16 int xCorner bool yCorner 打卡 True

思路:

首先,检查矩形的起点和终点是否在任何一个圆的范围内,如果是则不存在合法路径。接着,判断每个圆是否与矩形的左上角边界或右下角边界相交。对于与左上边界相交的圆,使用深度优先搜索(DFS),查找是否存在一组相连的圆,最终能连接到右下边界。若找到这样的路径,则矩形被封锁,返回 False。否则,表示有合法路径存在,返回 True

from typing import List

class Solution:
    def canReachCorner(self, xCorner: int, yCorner: int, circles: List[List[int]]) -> bool:
        
        # 判断点 (px, py) 是否在圆 (x, y, r) 内
        def pointInCircle(px: int, py: int, x: int, y: int, r: int) -> bool:
            return (x - px) ** 2 + (y - py) ** 2 <= r ** 2

        # 判断圆 (x, y, r) 是否与矩形的左上边界相交
        def circleIntersectsTopLeftOfRectangle(x: int, y: int, r: int, xCorner: int, yCorner: int) -> bool:
            return (abs(x) <= r and 0 <= y <= yCorner) or (0 <= x <= xCorner and abs(y - yCorner) <= r) or pointInCircle(x, y, 0, yCorner, r)

        # 判断圆 (x, y, r) 是否与矩形的右下边界相交
        def circleIntersectsBottomRightOfRectangle(x: int, y: int, r: int, xCorner: int, yCorner: int) -> bool:
            return (abs(y) <= r and 0 <= x <= xCorner) or (0 <= y <= yCorner and abs(x - xCorner) <= r) or (pointInCircle(x, y, xCorner, 0, r))

        # 判断两个圆 (x1, y1, r1) 和 (x2, y2, r2) 是否在矩形内相交
        def circlesIntersectInRectangle(x1: int, y1: int, r1: int, x2: int, y2: int, r2: int, xCorner: int, yCorner: int) -> bool:
            return (x1 - x2) ** 2 + (y1 - y2) ** 2 <= (r1 + r2) ** 2 and x1 * r2 + x2 * r1 < (r1 + r2) * xCorner and y1 * r2 + y2 * r1 < (r1 + r2) * yCorner

        # 访问标记数组,记录已经访问过的圆
        visited = [False] * len(circles)

        # 深度优先搜索函数
        def dfs(i: int) -> bool:
            x1, y1, r1 = circles[i]
            if circleIntersectsBottomRightOfRectangle(x1, y1, r1, xCorner, yCorner):
                return True
            visited[i] = True
            for j, (x2, y2, r2) in enumerate(circles):
                if not visited[j] and circlesIntersectInRectangle(x1, y1, r1, x2, y2, r2, xCorner, yCorner) and dfs(j):
                    return True
            return False

        # 主循环
        for i, (x, y, r) in enumerate(circles):
            # 检查起点或终点是否在任何一个圆内
            if pointInCircle(0, 0, x, y, r) or pointInCircle(xCorner, yCorner, x, y, r):
                return False
            # 如果圆与矩形的左上边界相交,并且通过 DFS 搜索找到了与右下角相连的路径,则返回 False
            if not visited[i] and circleIntersectsTopLeftOfRectangle(x, y, r, xCorner, yCorner) and dfs(i):
                return False
        return True

标签:return,21,16,int,xCorner,bool,yCorner,打卡,True
From: https://blog.csdn.net/weixin_53420521/article/details/143622847

相关文章

  • ubuntu:旧版本配置apt源(ubuntu 21.10)
    一,旧版本ubuntu上的apt源不能用了#apt-getupdate忽略:1http://mirrors.aliyun.com/ubuntuhirsuteInRelease忽略:2http://mirrors.aliyun.com/ubuntuhirsute-securityInRelease忽略:3http://mirrors.aliyun.com/ubuntuhirsute-updatesInRelease忽略:4http://mirro......
  • H3C UniServer R5300 G3安装Ubuntu16.04系统下11T容量RAID5只识别为900G
    组网及说明装配组件:H3CUniServerR5300G3-RS5Z1R5300C-CTO服务器-国内版板卡:P460-M4阵列卡系统版本:Ubuntu16.04问题描述1、实际上sdb是4块4T盘配置的raid5,在系统下lsblk查看到只有900G大小。2、HDM中逻辑卷容量识别正常,SDS日志无报错。3、按照smartpqi的驱动升级步骤未......
  • 洛谷题单指南-二叉堆与树状数组-P2827 [NOIP2016 提高组] 蚯蚓
    原题链接:https://www.luogu.com.cn/problem/P2827题意解读:初始n个数,每次取最大值x,根据u/v分成两部分:x*u/v,x-x*u/v,然后其余数都增加q,整个过程重复m次。输出有两类数据:第t,2t,3t...次取出的最大值;最后剩余的数第t,2t,3t...个,从大到小输出。解题思路:直观上,通过模拟法可以实......
  • 考研打卡(11)
    开局(11)开始时间 2024-11-07 14:12:35结束时间 2024-11-08 09:07:12上机ing数据结构下面关于图的存储的叙述中正确的是___(北京师范大学2015年)A用邻接表法存储图,占用的存储空间大小只与图中边数有关,而与结点个数无关B用邻接表法存储图,占用的存储空间大小与图中边数......
  • P7984 [USACO21DEC] Tickets P 题解
    题目传送门前置知识线段树优化建图|最短路解法考虑对票建虚点,从\(c_{i}\)向\(i+n\)连一条权值为\(p_{i}\)的边,然后从\(i+n\)向\([a_{i},b_{i}]\)连一条权值为\(0\)的边。建出反图后\(1\toi\)和\(n\toi\)的路径集合会有重复统计的部分,不妨以\(dis_{1,i......
  • 21. 创建和操纵表
    1.创建表MySQL不仅用于表数据操纵,而且还可以用来执行数据库和表的所有操作,包括表本身的创建和处理。一般有两种创建表的方法:使用具有交互式创建和管理表的工具(比如mysql命令行实用程序,MySQLAdministrator,MySQLQueryBrowser);表也可以直接用MySQL语句操纵。为了用程......
  • 洛谷 P2113 看球泡妹子(DP)
    传送门https://www.luogu.com.cn/problem/P2113解题思路可以设  表示前  场比赛看了  场,小红的满足度为  的最大精彩度。然后可以枚举前面的一个比赛 ,可以得到转移方程:但是,我们发现数组空间有一点小大,可以优化一下。发现每一次转移都是 ,于是可以滚动数组优化空......
  • 停课日志 part1 2024.10.21-10.25
    10.21次短路1.dijkstra用两个dist数组记录最短路和次短路适用条件:严格/非严格非简单2.dijkstra跑出最短路,保存路径,枚举删除路径上每一条边,跑最短路记录最大值。适用条件:非严格简单3.从起点s和终点t分别跑出最短路d1,d2,枚举图中每一条边<u,v>,计算(d1[u]+d2[v]+边权)的次大......
  • 2024-11-07_Thu_18:16 - 致力于变成有钱人,你愿意付出自己的一切吗 ?
    2024-11-07_Thu_18:16-致力于变成有钱人,你愿意付出自己的一切吗?事实上,所谓“想要”有三种层次。第一种层次是:“我想要变得富有。”换句话说,这句话的意思是“如果钱掉到我的头上我会接受”。只是想要,并不会起作用。你有没有注意过,想要并不必然导向“拥有”?光是想要却没有得到,会......
  • P4621 [COCI2012-2013#6] BAKTERIJE 题解
    一道很好的数学题。首先不难想到每个细菌的移动路线是有循环节的,循环节外的时间最多就是每个格子的四个方向都走一遍,也就是\(4\timesN\timesM\)。可以预处理每个细菌分别通过四个方向第一次到达终点的时间\(b_{i,0/1/2/3}\)和再次回到当前状态的循环节长度\(md_{i,0/1/2/......