题解 | #射击游戏#

射击游戏

https://www.nowcoder.com/practice/0e16a35fdc6c4da0a4b01a38706ded31

# 因为可旋转、可平移的缘故,可用怪物所在三个点构建一个新的坐标系,判断其他点是否在这个坐标系内即可
# 记录各个坐标系构建方式中可以包含最多的点
# 2条直线y=a1x+b1,y=a2x+b2垂直还是平行,取决于x的系数。若a1=12,则平行,若a1与a2互为负倒数,则垂直。
# 其中x的系数a=(x1-x2)/(y1-y2),(x1,y1)和(x2,y2)为直线y=ax+b所经过的2个点
n=int(input())
x=list(map(int,input().split()))
y=list(map(int,input().split()))
if n<=3:
    print(n)
else:
    ans=0 # 用于记录各个坐标系构建方式中可以包含最多的点
    for i in range(n-3): # 第一个点
        for j in range(i+1,n-2): # 第二个点
            x12=x[i]-x[j]  
            y12=y[i]-y[j]  
            for k in range(i+2,n-1): # 第三个点
                if k!=j:
                    count=3 # 前3个点构建成坐标系,那么前3个点必然是在该坐标系上的
                    for l in range(i+3,n): # 第四个点,需判断该点是否在前3个点构建的坐标系上
                        if l!=k and l!=j:
                            x34 = x[k]-x[l]  
                            y34 = y[k]-y[l]  
                            x14 = x[i]-x[l]  
                            y14 = y[i]-y[l]  
                            # x12/y12=-(y34/x34),x的系数互为负倒数,则垂直。避免0除异常,写成乘法形式x12*x34==-y12*y34
                            # x14/y14=x12/y12,x的系数相等,则平行,又经过同一点,则重合。避免0除异常,写成乘法形式x14*y12==x12*y14
                            if x12*x34==-y12*y34 or x14*y12==x12*y14: # 直线34垂直于12,或者直线14与12重合,则该点在前3个点构建的坐标系上
                                count+=1
                    ans=max(ans,count)
    print(ans)

全部评论

相关推荐

造车新势力 自动驾驶规控 29k * 13
点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务