给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交)。 如果相交,输出"Yes",否则输出"No"。
 

输入

第1行:一个数T,表示输入的测试数量(1 <= T <= 1000)
第2 - T + 1行:每行8个数,x1,y1,x2,y2,x3,y3,x4,y4。(-10^8 <= xi, yi <= 10^8)
(直线1的两个端点为x1,y1 | x2, y2,直线2的两个端点为x3,y3 | x4, y4)

输出

输出共T行,如果相交输出"Yes",否则输出"No"。

输入样例

2
1 2 2 1 0 0 2 2
-1 1 1 1 0 0 1 -1

输出样例

Yes
No
解:
方法一(函数):
  已知两点,故可以求得两点所在直线方程Ax+By+C=0。
  Ax1+By1=Ax2+By2----->A=k(y2-y1);B=k(x1-x2);C=k(x2y1-x1y2);
  另两点位置不应位于直线同侧(四点共线需特殊判断)。
  将另两点坐标分别带入方程,比较结果与零的关系,可以判断两点与直线的相对位置关系。
  (其实写这道题最大的收获是对于?:运算符的使用有了更多的理解)
 #include <stdio.h>

 long long num[];
int cfun()
{
long long a, b, c, fg1, fg2;
a = num[] - num[];
b = num[] - num[];
c = num[] * num[] - num[] * num[];
fg1 = a * num[] + b * num[] + c > ? : a * num[] + b * num[] + c == ? : -;///
fg2 = a * num[] + b * num[] + c > ? : a * num[] + b * num[] + c == ? : -;
if (fg1 * fg2 > ) return ;
else if ( == (fg1 | fg2))//不加这段if判断也可以ac,但其实程序并没有对于四点一线特殊情况的判断。
{
int max[], min[];
max[] = num[] > num[] ? (min[] = num[], num[]) : (min[] = num[], num[]);///
max[] = num[] > num[] ? (min[] = num[], num[]) : (min[] = num[], num[]);
if (max[] < min[] || max[] < min[]) return ;
else return ;
}
a = num[] - num[];
b = num[] - num[];
c = num[] * num[] - num[] * num[];
fg1 = a * num[] + b * num[] + c > ? : -;
fg2 = a * num[] + b * num[] + c > ? : -;
if (fg1 * fg2 > ) return ;
return ;
} int main()
{
int t;
while (scanf_s("%d", &t) != EOF)
{
//FILE *fp;
//fopen_s(&fp, "a.txt", "w" );
while (t--)
{
scanf_s("%lld%lld%lld%lld%lld%lld%lld%lld", &num[], &num[], &num[], &num[], &num[], &num[], &num[], &num[]);
fprintf(stdout,"%s\n", cfun() > ? "Yes": "No");
}
//fclose(fp);
}
return ;
}

方法二(向量):

  从网上看到的做法,简单的说就是通过两个实验

  1.快速排斥实验(判断以两点为对角线的矩形的重合情况)

  2.跨立实验(判断两点连线与另两点的相对位置关系【进行两次】)

  从而得出答案。

其实两种方法殊途同归,从数学的角度可以借此看出一些一次函数和向量的关系。

(图论)51NOD 1264 线段相交的更多相关文章

  1. 51nod 1264 线段相交(几何)

    题目链接:51nod 1264 线段相交 如果两条线段相交,则需满足一条线段的一个端点在另一条线段上,或者 两条线段都分别跨越另一条线段延伸的直线上.(如果点p1位于直线p3p4的一边,而点p2位于该 ...

  2. 51Nod 1264 线段相交(计算几何)

    1264 线段相交  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相 ...

  3. 判断线段相交 -- 51nod 1264 线段相交

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1264 三角形的有向面积:a.x*b.y+b.x*c.y+c.x*a.y ...

  4. 51nod 1264 线段相交——计算几何

    题目链接:http://www.51nod.com/Challenge/Problem.html#!#problemId=1264 检查点的位置就行了,具体见注释. /* (a-c)×(d-c)*(d ...

  5. 51nod 1264 线段相交

    题目:传送门. 题意:给两条线段,有一个公共点或有部分重合认为相交,问他们是否相交. 题解:这属于非规范相交的情况,模板题. #include <iostream> #include &l ...

  6. 51nod1264线段相交

    1264 线段相交 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交). 如果相交, ...

  7. (计算几何 线段判交) 51nod1264 线段相交

    1264 线段相交 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交). 如果相交,输出"Yes",否则输出"No".   ...

  8. 51nod--1264 线段相交 (计算几何基础, 二维)

    题目: 1264 线段相交 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为 ...

  9. 51Nod 1264:线段相交(计算几何)

    51Nod 1264:线段相交 Decision 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交). 如果相交,输出"Yes",否则输出&q ...

随机推荐

  1. Space Ant--poj1696(极角排序)

    http://poj.org/problem?id=1696 极角排序是就是字面上的意思   按照极角排序 题目大意:平面上有n个点然后有一只蚂蚁他只能沿着点向左走  求最多能做多少点 分析:  其实 ...

  2. [Bzoj2500]幸福的道路(树上最远点)

    2500: 幸福的道路 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 474  Solved: 194[Submit][Status][Discuss ...

  3. JVM内存区域(运行时数据区)划分

    前言: 我们每天都在编写Java代码,编译,执行.很多人已经知道Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文 ...

  4. 【scrapy】Item Pipeline

    After an item has been scraped by a spider,it is sent to the Item Pipeline which process it through ...

  5. Java知识图谱

    1.Java学习路径1 我想很多人看到这个路径可能会问我在哪里可以学习,所以就先附上这条路径的学习地址吧,这也是这张图片的来源,愿意学习的可以去看看:Java研发工程师学习路径 2.Java学习路径2 ...

  6. Android双向seekbar(带刻度)

    ※效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/disso ...

  7. iOS中MRC和ARC混编

    1. 在targets的build phases选项下Compile Sources下选择,不使用arc编译的文件.双击它.输入 -fno-objc-arc 就可以(这个类就能够使用MRC模式) 2. ...

  8. [LeetCode] Contains Duplicate(II,III)

    Contains Duplicate Given an array of integers, find if the array contains any duplicates. Your funct ...

  9. #include<> 和 #include""的区别

    #include< file >编译程序会先到标准函数库中找文件 #include”file” 编译程序会先从当前目录中找文件 参考原文 转: 在C程序中包含文件有以下两种方法: (1)用 ...

  10. POJ 2545+2591+2247+1338简单水题

    [题意简述]:就是有这种一个序列.就拿当p1 = 2,p2 = 3, p3 = 5,来举例.由这三个数为基准组成的序列是: 2,3,4,5,6,8,9,10,12--如今给你这个序列数组的下标,让你求 ...