数论之两直线相交

这种问题一般两种解法 一种就是普通的kx+b=kx+b,求解该方程即可; 还有一种就是跨立相交实验 下面给出代码

#include<bits/stdc++.h>
using namespace std;
struct line{
	double x1,y1;
	double x2,y2;
};
double dis(double x1,double y1,double x2,double y2){///叉乘 
	return x1*y2-x2*y1;
}
bool judge1(line a,line b){//跨立 
	if(max(a.x1,a.x2)<min(b.x1,b.x2)||max(b.x1,b.x2)<min(a.x1,a.x2)
	||max(a.y1,a.y2)<min(b.y1,b.y2)||max(b.y1,b.y2)<min(a.y1,a.y2))return 0;
	return 1;
}
bool judge2(line l1,line l2){//相交 在直线两侧即可
if( dis(l2.x1-l1.x1,l2.y1-l1.y1,l2.x1-l2.x2,l2.y1-l2.y2)*dis(l2.x1-l1.x2,l2.y1-l1.y2,l2.x1-l2.x2,l2.y1-l2.y2) <= 0 &&
    dis(l1.x1-l2.x1,l1.y1-l2.y1,l1.x1-l1.x2,l1.y1-l1.y2)*dis(l1.x1-l2.x2,l1.y1-l2.y2,l1.x1-l1.x2,l1.y1-l1.y2) <= 0) return 1;
   return 0;	
}
void slove(){
	line l1,l2;
	cin>>l1.x1>>l1.y1>>l1.x2>>l1.y2;
	cin>>l2.x1>>l2.y1>>l2.x2>>l2.y2;
	if(judge1(l1,l2)&&judge2(l1,l2)){
		cout<<"YES\n";
	}
	else {
		//cout<<judge1(l1,l2)<<" "<<judge2(l1,l2);
		cout<<"NO\n";
	}
}
int main(){///跨立与相交 
    	int N; 
		cin>>N;
	while(N--){
	   slove();		
	} 
	return 0;
}

首先judge1非常好理解就是两个线段相交那么他们水平方向或者垂直方向上一定有重合部分,没有重合部分就return 0; 其次是judge2我画了个图比较好理解 alt 就是对于任意一组两条虚线一定在实线两侧的意思 其次这道题最大的坑埋在要开double的基础上的。

全部评论

相关推荐

当年还在美团那个倒霉的&nbsp;Peppr&nbsp;团队工作时,我一直有个疑问:这群人每天到底在自嗨什么。每次开会一堆人围着一堆“看起来很高级”的文档转,模板统一、名词复杂、页数感人,每一页都在暗示一件事:“你不懂,是因为你不专业。”但现实是——代码照样写在&nbsp;💩&nbsp;山上,该出问题还是会出问题,这真的很逗,系统一出问题,文档的唯一作用就是证明:“我们当初确实认真写过文档。”所以本质区别到底是什么?是代码质量提升了,还是大家在精神层面完成了一次“工程师&nbsp;cosplay”?有句话说得好潮水退去才知道谁在裸泳。还记得当时的马哥、明哥(图&nbsp;1&nbsp;左)最爱反复强调一句话:“所有场景一定要想到。”、“这个场景为什么没考虑到?”不过他们这些话我是真的听进去了。不然我也不会在一年多前就说:这个项目活不过两年。顺带一提,那段时间还有个固定节目。每次下楼,总能听见我明哥在吐槽不同的人。我从他身后绕过去,经常能听到他一边抽烟一边说:“xx&nbsp;这小子太坑了,回头我一定要跟马哥说说。”于是深谙人情世故但真不会抽烟的我也会从口袋掏出一支低尼古丁含量的烟给自己点上,假意自己什么都没听到什么都不知道,只是来抽烟的。后来我才明白,这可能也是团队文化的一部分:问题永远在别人身上,而我们,永远在复盘里😂。
秋招白月光
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务