一、为了OFFER系列 | 阿里云天池赛在线编程:移动的圆
发布日期:2021-07-01 02:08:15 浏览次数:2 分类:技术文章

本文共 3420 字,大约阅读时间需要 11 分钟。

@Author:Runsen

大四刷题拼offer系列,不拼不行啊

关于:阿里云天池赛在线编程的介绍。

阿里云天池赛在线编程:在线编程限时赛,参与刷题,提升能力,奖品多多,助你晋级拿offer!

本人并没有参加,而是看看试题,自己不会也当作学习下。

移动的圆

描述:轨迹将指定两个圆A和B的圆心坐标( x , y x,y xy)和半径 r r r,现给你一个点 P P P,使圆 A A A圆心沿直线运动至点 P P P。请问圆 A A A在运动过程中是否会与圆B相交?(运动过程包括起点和终点)若会相交返回1,否则返回-1。

输入:[0,0,2.5,3,2,0.5,0,2]输出:1样例解释:圆A的圆心(0,0),半径为2.5,圆B的圆心(3,2),半径为0.5,点P(0,2),如图:

输入:[0,0,2,5,0,1,0,2]输出:-1样例解释:圆A的圆心(0,0),半径为2,圆B的圆心(5,0),半径为1,点P(0,2)

难度:中等。一开始就是使用圆相交的判断条件: r 1 − r 2 < = d i s < = r 1 + r 2 r1-r2 <= dis <= r1+r2 r1r2<=dis<=r1+r2。两个圆相交的充要条件是两圆圆心距大于两半径差的绝对值,小于两半径和 ,相切就是加上等于。

考点:点到线段的最短距离,两个点的距离公式。

关键是如何找到运动过程中的最小距离。

最小距离肯定是在同一条直线上,但是也有可能存在不在同一条直线的可能。那么最小距离就是两个端点值。

但是又有可能是大圆A 里面装着小圆B (这点必须考虑)

本题的通过率是16.77%。我觉得也很难,浪费了一个早上。考试就给你半个小时一题,可见我是多少的菜比。下面是自己的通过代码,其实想多下,就很简单

@Author: Runsen@微信公众号: 润森笔记@博客: https://blog.csdn.net/weixin_44510615@Date: 2020/8/28'''class Solution:    """    @param position: the position of circle A,B and point P.    @return: if two circle intersect return 1, otherwise -1.    """    def IfIntersect(self, position):	    x1, y1, r1, x2, y2, r2, xp, yp = position	    # 向量的表示	    vector_x1 = x2 - x1	    vector_y1 = y2 - y1	    vector_x2 = x2 - xp	    vector_y2 = y2 - yp	    vector_x3 = xp - x1	    vector_y3 = yp - y1	    #  y=ax+b 	    try:	        a = (y1 - yp) / (x1 - xp)	        b = y1 - a * x1	    except ZeroDivisionError:	        # 存在 0=ax+b	        a = 1	        b = (-1) * x1	    # 直线的距离公式	    d = abs(a * x2 - y2 + b) / ((a ** 2 + 1) ** (1 / 2))	    # 如果在圆内没有接触 大圆A 里面装着小圆B (必须考虑) 	    if r1 ** 2 > r2 ** 2 + (x2 - x1) ** 2 + (y2 - y1) ** 2 and  r1 ** 2 > r2 ** 2 + (x2 - xp) ** 2 + (y2 - yp) ** 2:	        return -1	    # 下面就是常见的情况:向量小于0,说明余弦角大于90,也是就最小距离取不到	    if (vector_x1 * vector_x3 + vector_y1 * vector_y3) <= 0 or -1 * (	            vector_x2 * vector_x3 + vector_y2 * vector_y3) <= 0:	        # 那么最小距离就是两个端点值,那么就判断r1+r2 小于就有交集,返回1	        if (((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5) <= r1 + r2 or (((x2 - xp) ** 2 + (y2 - yp) ** 2) ** 0.5) <= r1 + r2:	            return 1	        else:	            return -1	    else:	        # 下面就是角小于90,正常情况	        if d <= r1 + r2:	            return 1	        else:	            return -1

在查阅的时候,看了标准的做法。代码我都看不懂,

class Solution:    """    @param position: the position of circle A,B and point P.    @return: if two circle intersect return 1, otherwise -1.    """    def IfIntersect(self, position):            def getDistance(x, y, x1, y1, x2, y2):                        dx = x2 - x1            dy = y2 - y1            # 没有移动            if dx == 0 and dy == 0:                dx = x - x1                dy = y - y1                return float(dx ** 2 + dy ** 2) ** 0.5                        # what is t ?             # r ^ 2 = float(dx ** 2 + dy ** 2)            # (x - x1) / r  * dx / r  # cosine             # (y - y1) / r  * dy / r  # sine                        t = ((x - x1) * dx + (y - y1) * dy) / float(dx ** 2 + dy ** 2)            #             if t < 0:                dx = x - x1                dy = y - y1                            elif t > 1:                dx = x - x2                dy = y - y2                            else:                dx = x - (x1 + t * dx)                dy = y - (y1 + t * dy)                            return float(dx ** 2 + dy ** 2) ** 0.5                x1, y1, r1, x2, y2, r2, xp, yp = position         dis = getDistance( x2, y2, x1, y1, xp, yp)        return -1 if not r1 - r2 <= dis <= r1 + r2 else 1

转载地址:https://maoli.blog.csdn.net/article/details/108273868 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:六十八、快速幂算法、牛顿迭代法、累加数组+二分查找的变形
下一篇:入住两年的CSDN,在今天2020年8月27日,成为CSDN博客专家

发表评论

最新留言

不错!
[***.144.177.141]2024年04月21日 22时58分35秒