(图论)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); 另两点位置不应位于直线同侧(四点共线需特殊判断)。 将另两点坐标分别带入方程,比较结果与零的关系,可以判断两点与直线的相对位置关系。 (其实写这道题最大的收获是对于?:运算符的使用有了更多的理解)
1 #include <stdio.h> 2 3 long long num[8]; 4 int cfun() 5 { 6 long long a, b, c, fg1, fg2; 7 a = num[0] - num[2]; 8 b = num[3] - num[1]; 9 c = num[1] * num[2] - num[0] * num[3]; 10 fg1 = a * num[5] + b * num[4] + c > 0 ? 1 : a * num[5] + b * num[4] + c == 0 ? 0 : -1;/// 11 fg2 = a * num[7] + b * num[6] + c > 0 ? 1 : a * num[7] + b * num[6] + c == 0 ? 0 : -1; 12 if (fg1 * fg2 > 0) return 0; 13 else if (0 == (fg1 | fg2))//不加这段if判断也可以ac,但其实程序并没有对于四点一线特殊情况的判断。 14 { 15 int max[2], min[2]; 16 max[0] = num[0] > num[2] ? (min[0] = num[2], num[0]) : (min[0] = num[0], num[2]);/// 17 max[1] = num[4] > num[6] ? (min[1] = num[6], num[4]) : (min[1] = num[4], num[6]); 18 if (max[0] < min[1] || max[1] < min[0]) return 0; 19 else return 1; 20 } 21 a = num[4] - num[6]; 22 b = num[7] - num[5]; 23 c = num[6] * num[5] - num[4] * num[7]; 24 fg1 = a * num[1] + b * num[0] + c > 0 ? 1 : -1; 25 fg2 = a * num[3] + b * num[2] + c > 0 ? 1 : -1; 26 if (fg1 * fg2 > 0) return 0; 27 return 1; 28 } 29 30 int main() 31 { 32 int t; 33 while (scanf_s("%d", &t) != EOF) 34 { 35 //FILE *fp; 36 //fopen_s(&fp, "a.txt", "w" ); 37 while (t--) 38 { 39 scanf_s("%lld%lld%lld%lld%lld%lld%lld%lld", &num[0], &num[1], &num[2], &num[3], &num[4], &num[5], &num[6], &num[7]); 40 fprintf(stdout,"%s\n", cfun() > 0 ? "Yes": "No"); 41 } 42 //fclose(fp); 43 } 44 return 0; 45 }
方法二(向量):
从网上看到的做法,简单的说就是通过两个实验
1.快速排斥实验(判断以两点为对角线的矩形的重合情况)
2.跨立实验(判断两点连线与另两点的相对位置关系【进行两次】)
从而得出答案。
其实两种方法殊途同归,从数学的角度可以借此看出一些一次函数和向量的关系。
转载于:https://www.cnblogs.com/Ekalos-blog/p/10049339.html
(图论)51NOD 1264 线段相交相关推荐
- 51nod 1264 线段相交(跨立实验)
51nod1264:线段相交 判断线段相交: 关于快速排斥和跨立实验的博客:https://blog.csdn.net/li1615882553/article/details/80372202 在快 ...
- poj3304(线段相交问题)
题意:是否存在这样一条直线,使这条直线和所有的线段相交. #include<iostream> #include<algorithm> #include<cstring& ...
- poj1410(线段相交问题判断)
题意:给一个线段的两个端点坐标(确定线段),再给一个矩形的左上角的坐标和右下角的坐标(确定矩形),问判断该线段是否和矩形相交,在矩形内也算和矩形相交.直接用线段和矩形的四条边判断是否相交即可. #in ...
- 简单几何(线段相交+最短路) POJ 1556 The Doors
题目传送门 题意:从(0, 5)走到(10, 5),中间有一些门,走的路是直线,问最短的距离 分析:关键是建图,可以保存所有的点,两点连通的条件是线段和中间的线段都不相交,建立有向图,然后用Dijks ...
- 叉乘(三)——线段与线段相交吗?
用途3: 我们现在的任务就是判断线段P1P2和线段Q1Q2是否相交. 我们分两步确定两条线段是否相交: (1)快速排斥试验 设以线段 P1P2 为对角线的矩形为R, 设以线段 Q1Q2 为对角线的矩形 ...
- hdu 1558(线段相交+并查集)
题意:给你一些操作,P后边输入四个值,分别代表一条线段的起点.终点坐标,当输入Q时,后边输入一个整形值K,输出第k条线段所在的集合中包含的线段的个数. 解题思路:线段相交+并查集,sum[i]表示i所 ...
- POJ 2653 Pick-up sticks (线段相交)
题意:给你n条线段依次放到二维平面上,问最后有哪些没与前面的线段相交,即它是顶上的线段 题解:数据弱,正向纯模拟可过 但是有一个陷阱:如果我们从后面向前枚举,找与前面哪些相交,再删除前面那些相交的线段 ...
- 判断线段相交(hdu1558 Segment set 线段相交+并查集)
先说一下题目大意:给定一些线段,这些线段顺序编号,这时候如果两条线段相交,则把他们加入到一个集合中,问给定一个线段序号,求在此集合中有多少条线段. 这个题的难度在于怎么判断线段相交,判断玩相交之后就是 ...
- 几何基础之判断线段相交问题
1.判断两线段相交 只要判断q1,q2在线段s1s2的两侧和s1,s2在线段q1q2的两侧. q1s1q2s1>0就是在两侧. 2.矩形里有n条直线,一条直线的终点是另一条直线的起点.问矩形被分 ...
最新文章
- mysql error number 1130,[转]mysql error number 1130的解决方法
- 数据库access和mysql_数据库access和MYSQL有什么区别?
- Android开发小知识点(二)
- 微信开发之 二维码生成类库
- NumPy学习_00 ndarray的创建
- Scala与Java差异(四)之数组操作
- .idea文件夹是做什么的_33 个 IDEA 最牛配置,写代码太爽了!
- MobileNet V2简单总结
- 9:34 2009-7-28
- 李飞飞组开源大型室内场景的模拟环境iGibson
- python在匿名函数作和_python之路——内置函数和匿名函数
- cad 打开硬件加速卡_CAD画图卡顿?电脑带不动?4个简单实用的方法,解决CAD运行卡顿问题...
- ai人工智能的本质和未来_人工智能简介:这就是未来
- ajax异步下载文件并判断状态
- 易语言php使用次数,易语言统计重复数教学
- 创建企业级地理数据库
- 小学计算机说课稿模板,获奖小学信息技术说课稿模板
- matlab实现二元函数BP网络,m文件实现bp神经网络逼近二元函数
- pandas 行列转换
- spdep | 如何在R语言中计算空间自相关指数
热门文章
- condition_variable的怪事
- silverlight数据绑定
- Decision Tree决策树练习题
- php省城联动_thinkPHP实现的省市区三级联动功能示例
- python提取数组元素_python简单获取数组元素个数的方法
- qlineedit 设置界面不能输入_一个类似QQ的登陆界面为什么两个输入QLineEdit的上下距离太远...
- 华为鸿蒙全程,华为2020年全线启用鸿蒙系统
- python中类的使用_Python第九课-使用 类(class)创造新的数据类型!
- hive与hbase的联系与区别
- 萌宠NFT将于4月16日正式上线