HDOJ 1086 You can Solve a Geometry Problem too

打算好好练练计算几何。

昨天经过反省决定戒掉一做题就看题解的恶习,结果今天做题就抓瞎了。。。

因为刚开始有很多公式方法不知道,所以完全自己做就毫无思路= =。还是忍住没看题解,打开了手边的CLRS,我本来以为这里面关于计算几何的篇幅很少,应该讲不了什么。

然后我发现我错了,经典就是经典。关于判断线段相交的方法,讲的非常清楚,每一步包括叉乘等细节都有很详细的讲解。

看完之后手动敲,1A,代码:

#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
#define esp 1e-8
typedef struct Point
{
	double x,y;
}Point;
struct Line
{
	Point a,b;
}l[110];
double direction(Point pi,Point pj,Point pk)   //叉乘判断点pk在线段的哪一侧
{
	return (pk.x-pi.x)*(pj.y-pi.y)-(pj.x-pi.x)*(pk.y-pi.y);
}
bool on_segment(Point pi,Point pj,Point pk)   //判断点pk是否在线段pi_pk上
{
	if(pk.x>=min(pi.x,pj.x)&&pk.x<=max(pi.x,pj.x)&&pk.y>=min(pi.y,pj.y)&&pk.y<=max(pi.y,pj.y))
		return true;
	else
		return false;
}
bool judge(Point p1,Point p2,Point p3,Point p4)
{
	int d1=direction(p3,p4,p1);
	int d2=direction(p3,p4,p2);
	int d3=direction(p1,p2,p3);
	int d4=direction(p1,p2,p4);
	if(((d1>0&&d2<0)||(d1<0&&d2>0))&&((d3>0&&d4<0)||(d3<0&&d4>0))) //分别判断两组点,满足每一组的两个点都不在同一侧即可确定相交
		return true;
	else if(d1==0&&on_segment(p3,p4,p1)) //端点在线段上也算相交,下同
		return true;
	else if(d2==0&&on_segment(p3,p4,p2))
		return true;
	else if(d3==0&&on_segment(p1,p2,p3))
		return true;
	else if(d4==0&&on_segment(p1,p2,p4))
		return true;
	else
		return false;
}
int main(int argc, char const *argv[])
{
    //freopen("H:\\in.txt","r",stdin);
	int n;
	while(scanf("%d",&n),n)
	{
		int cnt=0;
		for(int i=0;i<n;i++)
			scanf("%lf%lf%lf%lf",&l[i].a.x,&l[i].a.y,&l[i].b.x,&l[i].b.y);
		for(int i=0;i<n;i++)
			for(int j=i+1;j<n;j++)
				if(judge(l[i].a,l[i].b,l[j].a,l[j].b))
					cnt++;
		printf("%d\n",cnt);
	}
	return 0;
}
时间: 2024-10-13 15:25:18

HDOJ 1086 You can Solve a Geometry Problem too的相关文章

hdoj 1086 You can Solve a Geometry Problem too 【计算几何】

题意:就是判断各线段之间有没有交点. 判断两线段相交,要运用到叉积.两个线段相交肯定相互跨越,假设一个条线段(p1p2),另一条是(q1q2),那么p1p2肯定在q1q2线段的两侧,那么运用叉积如果p1p2跨越q1q2的话(q1p1)x(q2p2)<= 0.同样也要验证 q1q2是不是也跨越p1p2,注意:p1p2跨越q1q2,不代两个线段相交,可能是p1p2跨越直线q1q2,所以说还是要再次判断q1q2是不是跨越p1p2 还有另外一种比较容易理解的解法: 就是如果两个线段相交,那么两线段两端端

HDU 1086 You can Solve a Geometry Problem too(判断线段相交)

题目地址:HDU 1086 就这么一道仅仅判断线段相交的题目写了2k多B的代码..是不是有点浪费...但是我觉得似乎哪里也优化不了了.... 判断线段相交就是利用的叉积.假如现在两条线段分别是L1和L2,先求L1和L2两个端点与L1的某个端点的向量的叉积,如果这两个的叉积的乘积小于0的话,说明L1在是在L2两个端点之间的,但此时并不保证一定相交.此时需要用同样的方法去判断L2是否在L1的两个端点之间,如果L2也在L1的两个端点之间的话,那就足以说明L1与L2相交.但是这题还需要判断是否端点也相交

hdu 1086 You can Solve a Geometry Problem too (几何)

You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6932    Accepted Submission(s): 3350 Problem Description Many geometry(几何)problems were designed in the ACM/I

hdu 1086 You can Solve a Geometry Problem too(求线段相交点个数 模板)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1086 ---------------------------------------------------------------------------------------------------------------------------------------------------------- 欢迎光临天资小屋:http://user.qzone.qq.com/593830943

HDU 1086 [You can Solve a Geometry Problem too] 计算几何

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1086 题目大意:给N条线段,问这些线段共有多少交点,多线交于一点要重复计算. 关键思想:叉乘可根据右手法则判断正负,相互跨越或者一条线段端点在另一条线段上则交点数+1. 代码如下: #include <iostream> using namespace std; const int MAXN=110; struct point{ double x,y; }; struct line{ point

You can Solve a Geometry Problem too(线段求交)

http://acm.hdu.edu.cn/showproblem.php?pid=1086 You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8861    Accepted Submission(s): 4317 Problem Description Many

HDU 1086:You can Solve a Geometry Problem too

You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6997    Accepted Submission(s): 3385 Problem Description Many geometry(几何)problems were designed in the ACM/

You can Solve a Geometry Problem too (hdu1086)几何,判断两线段相交

You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6837 Accepted Submission(s): 3303 Problem Description Many geometry(几何)problems were designed in the ACM/ICPC. A

hdoj-1086-You can Solve a Geometry Problem too 判断线段是否相交

You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8683 Accepted Submission(s): 4227 Problem Description Many geometry(几何)problems were designed in the ACM/ICPC.