1 // 线段相交 POJ 2653
2 // 思路:数据比较水,据说n^2也可以过
3 // 我是每次枚举线段,和最上面的线段比较
4 // O(n*m)
5
6 // #include <bits/stdc++.h>
7 #include <iostream>
8 #include <cstdio>
9 #include <cstdlib>
10 #include <algorithm>
11 #include <vector>
12 #include <math.h>
13 using namespace std;
14 #define LL long long
15 typedef pair<int,int> pii;
16 const double inf = 123456789012345.0;
17 const LL MOD =100000000LL;
18 const int N =1e5+10;
19 #define clc(a,b) memset(a,b,sizeof(a))
20 const double eps = 1e-8;
21 void fre() {freopen("in.txt","r",stdin);}
22 void freout() {freopen("out.txt","w",stdout);}
23 inline int read() {int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch=getchar();}while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}return x*f;}
24
25 int sgn(double x){
26 if(fabs(x) < eps)return 0;
27 if(x < 0)return -1;
28 else return 1;
29 }
30 struct Point{
31 double x,y;
32 Point(){}
33 Point(double _x,double _y){
34 x = _x;y = _y;
35 }
36 Point operator -(const Point &b)const{
37 return Point(x - b.x,y - b.y);
38 }
39 double operator ^(const Point &b)const{
40 return x*b.y - y*b.x;
41 }
42 double operator *(const Point &b)const{
43 return x*b.x + y*b.y;
44 }
45 };
46
47 struct Line{
48 Point s,e;
49 int inx;
50 Line(){}
51 Line(Point _s,Point _e){
52 s=_s;e=_e;
53 }
54 // pair<int,Point> operator & (const Line &b) const{
55 // Point res=s;
56 // if(sgn((s-e)^(b.s-b.e))==0){
57 // if(sgn((s-b.e)^(b.s-b.e))==0)
58 // return make_pair(0,res);
59 // else return make_pair(1,res);
60 // }
61 // double t=((s-b.s)^(b.s-b.e))/((s-e)^(b.s-b.e));
62 // res.x+=(e.x-s.x)*t;
63 // res.y+=(e.y-s.y)*t;
64 // return make_pair(2,res);
65 // }
66 };
67
68 Line line[N];
69 bool inter(Line l1,Line l2){
70 return
71 max(l1.s.x,l1.e.x) >= min(l2.s.x,l2.e.x) &&
72 max(l2.s.x,l2.e.x) >= min(l1.s.x,l1.e.x) &&
73 max(l1.s.y,l1.e.y) >= min(l2.s.y,l2.e.y) &&
74 max(l2.s.y,l2.e.y) >= min(l1.s.y,l1.e.y) &&
75 sgn((l2.s-l1.s)^(l1.e-l1.s))*sgn((l2.e-l1.s)^(l1.e-l1.s)) <= 0 &&
76 sgn((l1.s-l2.s)^(l2.e-l2.s))*sgn((l1.e-l2.s)^(l2.e-l2.s)) <= 0;
77 }
78
79 vector<Line> list;
80 bool cmp(Line l1,Line l2){
81 return l1.inx<l2.inx;
82 }
83
84 int main(){
85 vector<Line>::iterator it;
86 int n;
87 while(~scanf("%d",&n),n){
88 list.clear();
89 for(int i=1;i<=n;i++){
90 double x1,x2,y2,y1;
91 scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
92 line[i]=Line(Point(x1,y1),Point(x2,y2));
93 line[i].inx=i;
94 }
95 list.push_back(line[1]);
96 for(int i=2;i<=n;i++){
97 for(it=list.begin();it!=list.end();){
98 if(inter(line[i],*it)){
99 it=list.erase(it);
100 }
101 else it++;
102 }
103 list.push_back(line[i]);
104 }
105 printf("Top sticks: ");
106 sort(line+1,line+1+list.size(),cmp);
107 for(it=list.begin();it!=list.end();it++){
108 if(it!=list.end()-1){
109 printf("%d, ",(*it).inx);
110 }
111 else printf("%d.\n",(*it).inx);
112 }
113 }
114 return 0;
115 }