题意: 按顺序给出一堆线段的端点坐标 求最后没被覆盖的线段的序号 被覆盖(即后放入与先放入的相交) 利用叉积判断即可
#include <iostream>
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "math.h"
#include "algorithm"
#include <queue>
using namespace std;
#define modulo 1000000007
const double eps=1e-8;
int t,pos,first,last,vis[100001],ans,answer[1001];
struct ed {
double x1,y1,x2,y2;
}edge[100001];
double mult(double x1,double y1,double x2,double y2,double x3,double y3)
{
return (x1-x3)*(y2-y3)-(y1-y3)*(x2-x3);
}
int sgn(double x)
{
if(fabs(x)<eps) return 0;
if(x<0) return -1;
else return 1;
}
bool isinter(ed l1,ed l2)
{
return
max(l1.x1,l1.x2)>=min(l2.x1,l2.x2)&&
max(l2.x1,l2.x2)>=min(l1.x1,l1.x2)&&
max(l1.y1,l1.y2)>=min(l2.y1,l2.y2)&&
max(l2.y1,l2.y2)>=min(l1.y1,l1.y2)&&
sgn(mult(l1.x1,l1.y1,l1.x2,l1.y2,l2.x1,l2.y1))*sgn(mult(l1.x1,l1.y1,l1.x2,l1.y2,l2.x2,l2.y2))<=0&&
sgn(mult(l2.x1,l2.y1,l2.x2,l2.y2,l1.x1,l1.y1))*sgn(mult(l2.x1,l2.y1,l2.x2,l2.y2,l1.x2,l1.y2))<=0;
}
int main(void)
{
while(scanf("%d",&t)&&t)
{
pos=0;
ans=0;
memset(vis,0,sizeof vis);
for(int i=0;i<t;i++)
scanf("%lf%lf%lf%lf",&edge[i].x1,&edge[i].y1,&edge[i].x2,&edge[i].y2);
for(int i=0;i<t;i++)
for(int j=i+1;j<t;j++)
if(isinter(edge[i],edge[j])) {
vis[i]=1;
break;
}
printf("Top sticks:");
for(int i=0;i<t;i++)
if(!vis[i]) answer[pos++]=i+1;
for(int i=0;i<pos-1;i++)
printf(" %d,",answer[i]);
printf(" %d.\n",answer[pos-1]);
}
}