hdu1086计算n条线段的交点个数
来源:互联网 发布:js怎么给隐藏域赋值 编辑:程序博客网 时间:2024/06/05 12:39
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1086
题目大意:有n条线段,请输出交点的个数。如果有多条线段相交一点,你应当重复计数。(由示例可以看出,交点为一条线断的端点的非规范相交也符合题意)
解题思路:本题不需要用向量做,太麻烦了。直接用高中解析几何知识做,如果两点在直线两侧,带入直线方程,所得结果异号。即相互跨过,特殊情况(交点为其中一条线段的端点的也包含在内,注意“相互”二字)
代码如下:
#include<stdio.h>
#include<string.h>
#include<math.h>
typedef struct segment
{
double s1,e1,s2,e2;
}segment;//定义线段
segment a[105];
/*判断一条线段的两端端点是否在另一条的异侧(即跨过另一条线段),端点相交的非规范相交也满足题意*/
int intersect(segment a,segment b)
{
double x,y;
x=a.e1-((b.e2-b.e1)*a.s1+(b.e1*b.s2-b.e2*b.s1))/(b.s2-b.s1);
y=a.e2-((b.e2-b.e1)*a.s2+(b.e1*b.s2-b.e2*b.s1))/(b.s2-b.s1);
if(x*y<=0)//端点相交的情况体现在等号上
return 1;
else
return 0;
}
int main()
{
int n,i,j,count;
while(scanf("%d",&n),n)
{
count=0;
for(i=0;i<n;i++)
{
scanf("%lf%lf%lf%lf",&a[i].s1,&a[i].e1,&a[i].s2,&a[i].e2);
}
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
if(intersect(a[i],a[j])&&intersect(a[j],a[i]))//判断两条线段是否相互跨过(&&就是相互的意思)
count++;
}
printf("%d\n",count);
}
return 0;
}
- hdu1086计算n条线段的交点个数
- hdu1086+You can Solve a Geometry Problem too(计算几何,计算线段交点个数)
- hdu1086(线段交点)
- hdu1086 You can Solve a Geometry Problem too 计算几何求线段交点个数,快速排斥实验+跨立实验
- poj 3067 树状数组求逆序数(n条线段相交的交点个数)
- 计算N条直线所有可能的交点个数(动态规划)
- hunnu10522(判断两条线段的交点个数)
- 计算线段的交点
- C# 计算两条线段交点的位置
- 求n条直线交点个数
- HDU1086-线段相交点个数
- java计算两条线段交点
- You can Solve a Geometry Problem too(计算多个线段的交点个数)
- 1712: 数交点 正n边形内交点的个数
- ObjectARX学习笔记(廿八)---如何计算两条线段的交点AcGeLineSeg3d
- hdu1466 计算直线的交点个数
- 两条线段是否相交,计算交点公式。
- 两条线段是否相交,计算交点公式。
- 用div做页面的时候遇到的问题
- Python学习笔记三--socket
- 【java系列之原生数据类型】
- hdu 1664 Different Digits
- 关于在MFC中加载PNG图片
- hdu1086计算n条线段的交点个数
- CopyU!的内核引擎升级到1.2.288.104
- 小知识点集合
- 九度笔记之 1528:最长回文子串 用manacher算法
- Oracle 只读表空间 说明
- eclipse 阅读代码高效快捷键
- 银联+移动+三星PK微信、余额宝
- 在对xml进行操作完成之后一定要记得保存,否则等于没操作
- 沙盒解决方案与场解决方案之间的差异