射击 python

小易正在玩一款新出的射击游戏,这个射击游戏在一个二维平面进行,小易在坐标原点(0,0),平面上有n只怪物,每个怪物有所在的坐标(x[i], y[i])。小易进行一次射击会把x轴和y轴上(包含坐标原点)的怪物一次性消灭。
小易是这个游戏的VIP玩家,他拥有两项特权操作:
1、让平面内的所有怪物同时向任意同一方向移动任意同一距离
2、让平面内的所有怪物同时对于小易(0,0)旋转任意同一角度
小易要进行一次射击。小易在进行射击前,可以使用这两项特权操作任意次。
小易想知道在他射击的时候最多可以同时消灭多少只怪物,请你帮帮小易。

如样例所示:
这里写图片描述

所有点对于坐标原点(0,0)顺时针或者逆时针旋转45°,可以让所有点都在坐标轴上,所以5个怪物都可以消灭。

输入描述:

输入包括三行。
第一行中有一个正整数n(1 ≤ n ≤ 50),表示平面内的怪物数量。
第二行包括n个整数x[i](-1,000,000 ≤ x[i] ≤ 1,000,000),表示每只怪物所在坐标的横坐标,以空格分割。
第二行包括n个整数y[i](-1,000,000 ≤ y[i] ≤ 1,000,000),表示每只怪物所在坐标的纵坐标,以空格分割。

输出描述:

输出一个整数表示小易最多能消灭多少只怪物。

示例1

输入

5
0 -1 1 1 -1
0 -1 -1 1 1

输出

5

代码:

## 这道题的题的关键在于怎么平行和垂直的点
## 根据垂直于平行条件可判断
## 分为两种情况
## 当点数少于4时,设计最多为当前点数,因为两点连成一条线
## 第3点无论是否在这条直线上,都能消除,不在线上可做垂直处理
## 当点数大于等于四时,采用四重循环
## 第1重,从第一个点出发到第n-3,每次取一个点
## 第2,3,4重都取非重复点,当满足垂直或平行判断时,计数加1
n = int(input())
x,y = list(map(int, input().split())),list(map(int, input().split()))
#axis = [[x[i],y[i]] for i in range(n)]

max_n = 0
if n < 4:
    max_n = n
for i in range(n-3):
    for j in range(i+1,n-2):
        if i != j:
            X1 = x[j] - x[i]
            Y1 = y[j] - y[i]
            for k in range(i+2,n-1):
                if (k != i)and(k != j):
                    count = 3
                    for l in range(i+3,n):
                        if (l != i)and(l != j)and(l != k):
                            X2 = x[l] - x[k]
                            Y2 = y[l] - y[k]
                            X3 = x[l] - x[i]
                            Y3 = y[l] - y[i]
                            ## 第四个点,在垂直线上,在平行线上都满足条件
                            if (X1*X2+Y1*Y2==0) or (X1*Y3==X3*Y1):
                                count += 1
                    if (count > max_n):
                        max_n = count
print (max_n)
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐