NewOJ 题解 [1030-线段相交] (Python)

题目链接

题目描述

输入线段AB、CD的两端点,判断两线段是否相交(包含端点)。

输入格式

有多组数据,每组数据两行,第一行四个整数,分别表示A、B两点坐标,第二行四个整数,分别表示C、D两点坐标。

输出格式

如果线段AB与线段CD相交,输出yes,否则输出no。

输入样例

0 1 1 1
1 0 2 1
1 0 2 1
0 1 2 0
0 0 0 1
1 0 0 0

输出样例

no
yes
yes

思路

这个可以算是一道数学题,主要是利用向量叉乘的定理。两向量a,b叉乘,结果若小于0,则表示向量b在向量a的顺时针的方向,若大于0,则表示在逆时针,若等于0则表示两向量平行。

给出两条线段,问两线段是否相交?

我主要是参考这篇博客:https://www.cnblogs.com/tuyang1129/p/9390376.html

博客中详细介绍了判断两线段是否相交的各种情况。

代码实现

import sys

for line in sys.stdin:
    a1,a2,b1,b2 = map(eval,line.split())
    c1,c2,d1,d2 = map(eval,input().split())
    AB = (b1-a1,b2-a2)
    CD = (d1-c1,d2-c2)
    AC = (c1-a1,c2-a2)
    AD = (d1-a1,d2-a2)
    CA = (a1-c1,a2-c2)
    CB = (b1-c1,b2-c2)
    BC = (c1-b1,c2-b2)
    if (AB[0]*AC[1]-AB[1]*AC[0])*(AB[0]*AD[1]-AB[1]*AD[0]) <= 0 and (CD[0]*CA[1]-CD[1]*CA[0])*(CD[0]*CB[1]-CD[1]*CB[0]) <= 0:
        if (AB[0]*CD[1]-AB[1]*CD[0]) == 0:
            if(BC[0]*CD[1]-BC[1]*CD[0]) == 0 and(a1<=c1<=b1 or c1<=a1<=d1):
                print("yes")
            else:
                print("no")
        else:
            print("yes")
    else:
        print("no")

时间复杂度: O(1)

空间复杂度: O(1)

posted @ 2021-12-31 14:56  egospace  阅读(476)  评论(0)    收藏  举报