哈理工OJ 1559 线段相交(计算几何)

原创 2016年05月30日 21:10:14

http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1559
线段相交
Time Limit: 1000 MS Memory Limit: 10240 K
Total Submit: 211(79 users) Total Accepted: 98(72 users) Rating: Special Judge: No
Description
给定线段P1P2(P1和P2是线段的两端点,且不重合)、P3P4(P3和P4是线段的两端点,且不重合),判断P1P2和P3P4是否相交。P1P2和P3P4相交,即指存在一个点P,它既落在P1P2上又落在P3P4上(含线段的端点)。

Input
输入数据有多组,第一行为测试数据的组数N,下面包括2N行,每组测试数据含2行,第一行为P1P2的坐标值,第二行为P3P4的坐标值,比如下面的数据

表示P1、P2、P3、P4的坐标分别为:P1(0,0),P2(1,1),P3(2,2),P4(3,3)

Output
判断每组数据中的线段P1P2和P3P4是否相交,如果相交输出YES,否则输出NO。每组数据输出占一行。

Sample Input
2
0 0 1 1
2 2 3 3
0 0 2 0
0 0 1 3
Sample Output
NO
YES
Hint
两线段相交分为“规范相交”和“非规范相交”。 “规范相交”指的是两条线段恰有唯一一个不是端点的公共点;而如果一条线段的一个端点在另一条线段上,或者两条线段部分重合,则视为“非规范相交”,本题是“非规范相交”。

定义点坐标类型时需用double

本题算是一个计算几何的小知识点吧,学会了怎么判断两个线段是不是相交,那么问题来了,是怎么判断的呢?这个问题高中生来了就可以帮我们解决了,高中我们学过怎么判断一条线段与直线是否相交,然后就很简单了

下面是AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

struct point
{
    double x,y;
} a,b,c,d;

bool judge(point a,point b,point c,point d)
{
    double k=(d.y-c.y)/(d.x-c.x);//直线cd的斜率
    double cc=(d.y-k*d.x);//直线cd表达式中的常数
    double fa=k*a.x+cc-a.y;
    double fb=k*b.x+cc-b.y;

    if(fa*fb>0)
    {
        return false;
    }
    else if(fa==0&&fb!=0)
    {
        return true;
    }
    else if(fa!=0&&fb==0)
        return true;
    else
    {
        return true;
    }
}

bool judgeline(point a,point b,point c,point d)
{
    if(judge(a,b,c,d)==true)
    {
        if(judge(c,d,a,b)==true)
        {
            return true;
        }
    }
    return false;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y);
        scanf("%lf%lf%lf%lf",&c.x,&c.y,&d.x,&d.y);
        if(min(a.x,b.x)>max(c.x,d.x)||min(a.y,b.y)>max(c.y,d.y)||min(c.x,d.x)>max(a.x,b.x)||min(c.y,d.y)>max(a.y,b.y))
        {
            printf("NO\n");
            continue;
        }
        bool re=judgeline(a,b,c,d);
        if(re==true)
        {
            printf("YES\n");
        }
        else
        {
            printf("NO\n");
        }
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

入门经典_Chap03_题解总结

前言     算法竞赛入门经典这本书,虽然书已经看到第7章了,但是题目和题解才刚刚把第三章的写好,虽说这一章的题基本上都是挺水的,但是为了更好地筑固基础,却不敢贪多求快,争取把每一道题弄清楚了再往...
  • a27038
  • a27038
  • 2017年02月23日 17:29
  • 250

51Nod 1298 圆与三角形

题目链接: 51Nod 1298 圆与三角形 题目描述: 给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交。相交输出”Yes”,否则输出”No”。(三角形的面积大于0)。 Inp...

hrbust 哈理工oj 1729 Finding the Way【计算几何】

Finding the Way Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 8...

hrbust/哈理工oj 1507 水神的栅栏【计算几何+并查集】

水神的栅栏 Time Limit: 1000 MS Memory Limit: 65535 K Total Submit: 41(16 users...

哈理工OJ 1642 多边形-1【计算几何】【判断凸凹包】

多边形-1 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 61(34 users...

hrbust 1069 哈理工oj Bee Movie【计算几何】【学习叉乘】

Bee Movie Time Limit: 1000 MS Memory Limit: 65536 K Total Submit: 64(47 users) Total Acc...

hrbust 哈理工oj 1752Page Rank【线段树好题】

Page Rank Time Limit: 1000 MS Memory Limit: 65536 K Total Submit: 85(30 u...

哈理工OJ 1189 区间最大值 II(线段树【简单】)

区间最大值 II Time Limit: 1000 MS Memory Limit: 65535 K Total Submit: 485(160 users) Total Accepted:...

哈理工OJ 2256 南西群岛海域·冲之岛近海(线段树区间更新+前缀和优化)

题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2256南西群岛海域·冲之岛近海 Time...

hdu 1394/哈理工oj 1250 Minimum Inversion Number【线段树过】

Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:哈理工OJ 1559 线段相交(计算几何)
举报原因:
原因补充:

(最多只允许输入30个字)