判断两线段是否相交,套模版即可。记得判相交时是判断当前线段是否与排在它后面的线段相交。
以下是代码:
- #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;
}