原题链接:http://poj.org/problem?id=2653
线段相交。
从后往前筛TLE,从前往后却AC了,数据坑爹。
1 #include <cstdio> 2 #define maxn 100005 3 const double eps = 1e-8; 4 struct segment 5 { 6 double x1, y1, x2, y2; 7 }seg[maxn]; 8 9 double min(double a, double b) 10 { 11 return a < b ? a : b; 12 } 13 14 double max(double a, double b) 15 { 16 return a > b ? a : b; 17 } 18 19 bool segcross(segment seg1, segment seg2) 20 { 21 if(min(seg1.x1, seg1.x2) > max(seg2.x1, seg2.x2) || 22 min(seg1.y1, seg1.y2) > max(seg2.y1, seg2.y2) || 23 min(seg2.x1, seg2.x2) > max(seg1.x1, seg2.x2) || 24 min(seg2.y1, seg2.y2) > max(seg1.y1, seg2.y2)) return 0; 25 26 double h, i, j, k; 27 h = (seg1.x2 - seg1.x1) * (seg2.y1 - seg1.y1) - (seg1.y2 - seg1.y1) * (seg2.x1 - seg1.x1); 28 i = (seg1.x2 - seg1.x1) * (seg2.y2 - seg1.y1) - (seg1.y2 - seg1.y1) * (seg2.x2 - seg1.x1); 29 j = (seg2.x2 - seg2.x1) * (seg1.y1 - seg2.y1) - (seg2.y2 - seg2.y1) * (seg1.x1 - seg2.x1); 30 k = (seg2.x2 - seg2.x1) * (seg1.y2 - seg2.y1) - (seg2.y2 - seg2.y1) * (seg1.x2 - seg2.x1); 31 return h * i < eps && j * k < eps; 32 } 33 34 int main() 35 { 36 int n, i, j, stick[1005], cnt; 37 bool flag; 38 while(scanf("%d", &n), n) 39 { 40 for(i = 0; i < n; i ++) 41 scanf("%lf%lf%lf%lf", &seg[i].x1, &seg[i].y1, &seg[i].x2, &seg[i].y2); 42 43 cnt = 0; 44 45 for(i = 0; i < n; i ++) 46 { 47 flag = false; 48 for(j = i + 1; j < n; j ++) 49 { 50 if(segcross(seg[i], seg[j])) 51 { 52 flag = true; 53 break; 54 } 55 } 56 if(!flag) 57 stick[++ cnt] = i + 1; 58 } 59 printf("Top sticks:"); 60 for(i = 1; i < cnt; i ++) 61 { 62 printf(" %d,", stick[i]); 63 } 64 printf(" %d.\n", stick[i]); 65 } 66 return 0; 67 }