向量平行

链接:https://ac.nowcoder.com/acm/contest/11216/A 来源:牛客网

给定n个向量的起点和终点x1,y1,x2,y2,再给出一个目标向量,求能否由n个向量中的两个相加构造出一个与目标向量平行的向量(注意,平行包括方向相同或相反)

保证x1≠x2 y1≠y2,保证两个向量相加不为零向量

输入描述:

第一行给定一个整数n
接下来n行每行四个整数x1,y1,x2,y2,表示第i个向量的起点和终点
最后一行给出四个整数x1,y1,x2,y2,表示目标向量的起点和终点
1≤n≤1000,1 \leq n \leq 1000,1≤n≤1000,1≤x1,y1,x2,y2≤100001\leq x1,y1,x2,y2 \leq 100001≤x1,y1,x2,y2≤10000

输出描述:

若可以,输出“YES”
否则输出“NO”(均不含引号)

示例1

输入

5
1 2 4 8
2 4 5 10
1 2 2 4
3 5 4 6 
6 10 7 11
1 1 4 7

输出

YES

说明

1号向量与3号向量相加

解法

向量(a, b) // (c, d)的条件是:a * d = b * c

向量加法:(a, b) + (c, d) = (a+c, b+d)

(其中(a, b)表示一个向量,a是向量的水平分量,b是竖直分量)

求出每个向量,两两组合相加后,分别与目标向量判断平行即可

n = int(input())+ 1

x = [0]*n
y = [0]*n
for i in range(n):
    nums = list(map(int, input().split()))
    x1, y1, x2, y2 = nums[0], nums[1], nums[2], nums[3]
    x[i] = x2-x1  # 求向量的水平分量
    y[i] = y2-y1  # 求向量的水垂直分量

def check():
    for i in range(n-1):
        for j in range(i+1, n-1):
            xk = x[i] + x[j]
            yk = y[i] + y[j]	#两两组合相加
            if xk * y[n-1] == yk * x[n-1]:
                return True
    return False
if check():
    print("YES")
else:
    print("NO")

最后更新于