【HDOJ】2150 Pipe

计算几何的基础题目。是时候刷刷计算几何了。

  1 /* 2150 */
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cstdlib>
  5 
  6 typedef struct {
  7     int x, y;
  8 } Point_t;
  9 
 10 typedef struct {
 11     Point_t b, e;
 12     int v;
 13 } Pipe_t;
 14 
 15 #define MAXN 105
 16 
 17 Point_t points[MAXN];
 18 Pipe_t pipes[MAXN*30];
 19 
 20 int max(int a, int b) {
 21     return a>b ? a:b;
 22 }
 23 
 24 int min(int a, int b) {
 25     return a<b ? a:b;
 26 }
 27 
 28 
 29 int direction(Point_t p0, Point_t p1, Point_t p2) {
 30     return (p1.x-p0.x)*(p2.y-p0.y) - (p2.x-p0.x)*(p1.y-p0.y);
 31 }
 32 
 33 bool onSegment(Point_t p0, Point_t p1, Point_t p2) {
 34     if ( (min(p0.x,p1.x)<=p2.x && p2.x<=max(p0.x,p1.x)) && ((min(p0.y,p1.y)<=p2.y && p2.y<=max(p0.y,p1.y))) )
 35         return true;
 36     return false;
 37 }
 38 
 39 bool intersect(Pipe_t x, Pipe_t y) {
 40     if (x.v == y.v)
 41         return false;
 42     Point_t p1 = x.b, p2 = x.e, p3 = y.b, p4 = y.e;
 43     int d1 = direction(p3, p4, p1);
 44     int d2 = direction(p3, p4, p2);
 45     int d3 = direction(p1, p2, p3);
 46     int d4 = direction(p1, p2, p4);
 47     if ( ((d1>0 && d2<0) || (d1<0 && d2>0)) && ((d3<0 && d4>0) || (d3>0 && d4<0)) )
 48         return true;
 49     else if (d1==0 && onSegment(p3, p4, p1))
 50         return true;
 51     else if (d2==0 && onSegment(p3, p4, p2))
 52         return true;
 53     else if (d3==0 && onSegment(p1, p2, p3))
 54         return true;
 55     else if (d4==0 && onSegment(p1, p2, p4))
 56         return true;
 57     else
 58         return false;
 59 }
 60 
 61 int main() {
 62     int n, m;
 63     int i, j, k;
 64     bool flag;
 65     
 66     #ifndef ONLINE_JUDGE
 67         freopen("data.in", "r", stdin);
 68     #endif
 69     
 70     while (scanf("%d", &n) != EOF) {
 71         m = 0;
 72         flag = true;
 73         for (i=0; i<n; ++i) {
 74             scanf("%d", &k);
 75             for (j=0; j<k; ++j)
 76                 scanf("%d %d", &points[j].x, &points[j].y);
 77             for (j=1; j<k; ++j)    {
 78                 pipes[m].b = points[j-1];
 79                 pipes[m].e = points[j];
 80                 pipes[m].v = i;
 81                 ++m;
 82             }
 83         }
 84         for (i=0; i<m; ++i) {
 85             for (j=i+1; j<m; ++j) {
 86                 if (intersect(pipes[i], pipes[j])) {
 87                     flag = false;
 88                     goto _output;
 89                 }
 90             }
 91         }
 92         _output:
 93         if (flag)
 94             printf("No\n");
 95         else
 96             printf("Yes\n");
 97     }
 98 
 99     return 0;
100 }

 

posted on 2014-12-27 03:30  Bombe  阅读(168)  评论(0编辑  收藏  举报

导航