#include<iostream> #define MAX 100010 using namespace std; typedef struct Piont { double x,y; }point; typedef struct Zx { point start,end; bool key; }zx; int max(int x,int y) { return x>y? x:y; } int min(int x,int y) { return x<y? x:y; } double multi(point p0,point p1,point p2)//计算矢量[p0,p1], [p0,p2] 的叉积 { return (p1.x-p0.x)*(p2.y-p0.y) -(p2.x-p0.x)*(p1.y-p0.y); } bool is_cross(point s1,point e1,point s2,point e2)//判断直线相交 { return max(s1.x,e1.x)>=min(s2.x,e2.x)&& max(s2.x,e2.x)>=min(s1.x,e1.x)&& max(s1.y,e1.y)>=min(s2.y,e2.y)&& max(s2.y,e2.y)>=min(s1.y,e1.y)&& multi(s2,e1,s1)*multi(e1,e2,s1)>=0&& multi(s1,e2,s2)*multi(e2,e1,s2)>=0; } zx z[MAX]; int main() { int n,i,j; while(scanf("%d",&n)!=EOF&&n) { for(i=1;i<=n;i++) { scanf("%lf%lf%lf%lf",&z[i].start.x,&z[i].start.y, &z[i].end.x,&z[i].end.y); z[i].key=false; } printf("Top sticks:"); for(i=1;i<=n;i++) { for(j=i+1;j<=n;j++) if(is_cross(z[i].start,z[i].end,z[j].start,z[j].end)) {z[i].key=true;break;}//最后一个错误当 i 遇到一条直线相交就将key赋true 然后break; if(z[i].key==false&&i!=n) //可防止超时!!! printf(" %d,",i); } printf(" %d./n",n); } system("pause"); return 0; } http://acm.pku.edu.cn/JudgeOnline/problem?id=2653