poj 2653
来源:互联网 发布:卫生网络试题及答案 编辑:程序博客网 时间:2024/06/13 08:15
判断两线段是否相交,套模版即可。记得判相交时是判断当前线段是否与排在它后面的线段相交。
以下是代码:
- #include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int M=100010;
const double eps=1e-9; - double max(double a,double b) {return a>b?a:b;}
double min(double a,double b) {return a<b?a:b;}
struct point
{
double x,y;
};
struct sticks
{
point p1,p2;
}s[M];
int n; - double crossmul(point p1,point p2,point p3)
{
return (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x);
} - bool cross(sticks a,sticks b)
{
if(max(a.p1.x,a.p2.x)>min(b.p1.x,b.p2.x) && max(b.p1.x,b.p2.x)>min(a.p1.x,a.p2.x) &&
max(a.p1.y,a.p2.y)>min(b.p1.y,b.p2.y) && max(b.p1.y,b.p2.y)>min(a.p1.y,a.p2.y) &&
crossmul(a.p1,a.p2,b.p1)*crossmul(a.p1,a.p2,b.p2)<=eps &&
crossmul(b.p1,b.p2,a.p1)*crossmul(b.p1,b.p2,a.p2)<=eps) - //用叉乘判断两线段是否相交
return true;
return false;
} - int main()
{
while(scanf("%d",&n),n)
{
int i,j;
for(i=1;i<=n;i++)
{
scanf("%lf%lf%lf%lf",&s[i].p1.x,&s[i].p1.y,&s[i].p2.x,&s[i].p2.y);
}
printf("Top sticks:");
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
if(cross(s[i],s[j])) break;
if(j==n)
printf(" %d,",i);
}
}
printf(" %d./n",n);
}
return 0;
}
- poj 2653
- poj 2653
- poj 2653
- poj 2653
- POJ-2653
- poj 2653
- poj 2653
- POJ 2653
- POJ 2653 线段相交
- poj 2653 Intersecting Lines
- poj 2653 几何
- 【几何训练】poj 2653
- POJ 2653 线段交
- 【计算几何】POJ 2653
- POJ 2653 线段相交
- POJ
- poj
- POJ
- 对攻击者伪装成可信IP地址的攻击之防范策略
- 语法分析 -- 学习笔记
- getSystemService()是Android很重要的一个API
- 3招搞定Windows恶意代码攻击
- 转换 IList 到 IList
- poj 2653
- Linux下编程为什么多用进程少用线程
- 网站策划介绍
- 算法学习-排序算法-快速排序
- 数组公式基本功修炼之数组公式解读
- 新手
- 支点(无限接近的根号)
- Java类的加载、链接和初始化
- STM32 调试时,出现:cannot access memory!!!