POJ2653 Pick-up sticks

  原题链接:http://poj.org/problem?id=2653

  线段相交。

  从后往前筛TLE,从前往后却AC了,数据坑爹。

View Code
 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 }
posted @ 2012-10-20 18:25  芒果布丁  阅读(139)  评论(0编辑  收藏  举报