(图论)51NOD 1264 线段相交
输入
第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 线段相交的更多相关文章
- 51nod 1264 线段相交(几何)
		题目链接:51nod 1264 线段相交 如果两条线段相交,则需满足一条线段的一个端点在另一条线段上,或者 两条线段都分别跨越另一条线段延伸的直线上.(如果点p1位于直线p3p4的一边,而点p2位于该 ... 
- 51Nod 1264 线段相交(计算几何)
		1264 线段相交 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相 ... 
- 判断线段相交 -- 51nod  1264 线段相交
		http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1264 三角形的有向面积:a.x*b.y+b.x*c.y+c.x*a.y ... 
- 51nod 1264 线段相交——计算几何
		题目链接:http://www.51nod.com/Challenge/Problem.html#!#problemId=1264 检查点的位置就行了,具体见注释. /* (a-c)×(d-c)*(d ... 
- 51nod 1264 线段相交
		题目:传送门. 题意:给两条线段,有一个公共点或有部分重合认为相交,问他们是否相交. 题解:这属于非规范相交的情况,模板题. #include <iostream> #include &l ... 
- 51nod1264线段相交
		1264 线段相交 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交). 如果相交, ... 
- (计算几何 线段判交) 51nod1264 线段相交
		1264 线段相交 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交). 如果相交,输出"Yes",否则输出"No". ... 
- 51nod--1264 线段相交 (计算几何基础, 二维)
		题目: 1264 线段相交 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为 ... 
- 51Nod 1264:线段相交(计算几何)
		51Nod 1264:线段相交 Decision 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交). 如果相交,输出"Yes",否则输出&q ... 
随机推荐
- Java的发送邮件
			以下内容引用自http://wiki.jikexueyuan.com/project/java/sending-email.html: 用Java应用程序来发送一封电子邮件是足够简单的,但是开始时应该 ... 
- Eureka 简介
			Eureka 简介 
- js:简单的拖动效果
			效果演示:https://jsfiddle.net/dwqs/b5ywws9f/embedded/result/ html: <div class="wrap"> &l ... 
- http://vdceye.com/ 全新页面上线
			vdceye manager home page 
- Android中的图片查看器
			本案例,使用Eclipse来开发Android2.1版本号的图片查看器. 1)首先,打开Eclipse.新建一个Android2.1版本号的项目ShowTu,打开res/values中文件夹下的str ... 
- Deepin-我为什么推荐它!
			针对Win上的开发软件,大部分都需要密匙或者破解,而Deepin不敢说一应俱全,但全沾边是没问题的 无论是编程.娱乐还是其它的,基本上都可以做到,而且它还应用了Crossover来兼容大部分的Win软 ... 
- 理解Android ANR的触发原理(转)
			一.概述 ANR(Application Not responding),是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过 ... 
- Windows——cmd findstr 字符串查找增强使用说明
			在文件中寻找字符串. 复制代码代码如下: FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file] [ ... 
- JNI返回复杂对象之中的一个
			需求: 首先说需求.近期接手一个项目.要在底层解析二进制数据,数据结构比較负责,因为server是c++server,加之開始没有考虑到移动端开发,所以协议有点扯蛋.大体是这种,一个数据包里面是map ... 
- Redis和Memcache性能测试对比
			Redis和Memcache在写入性能上面差别不大,读取性能上面尤其是批量读取性能上面Memcache全面胜出,当然Redis也有自己的优点:比如数据持久化.支持更多的数据结构(Set List ZS ... 
