poj 2653

来源:互联网 发布:卫生网络试题及答案 编辑:程序博客网 时间:2024/06/13 08:15

     判断两线段是否相交,套模版即可。记得判相交时是判断当前线段是否与排在它后面的线段相交。

 

      以下是代码:

 

  1. #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    const int M=100010;
    const double eps=1e-9;
  2. double max(double a,double b) {return a>b?a:b;}
    double min(double a,double b) {return a<b?a:b;}
    struct point
    {
     double x,y;
    };
    struct sticks
    {
     point p1,p2;
    }s[M];
    int n;
  3. double crossmul(point p1,point p2,point p3)
    {
     return (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x);
    }
  4. bool cross(sticks a,sticks b)
    {
     if(max(a.p1.x,a.p2.x)>min(b.p1.x,b.p2.x) && max(b.p1.x,b.p2.x)>min(a.p1.x,a.p2.x) &&
        max(a.p1.y,a.p2.y)>min(b.p1.y,b.p2.y) && max(b.p1.y,b.p2.y)>min(a.p1.y,a.p2.y) &&
        crossmul(a.p1,a.p2,b.p1)*crossmul(a.p1,a.p2,b.p2)<=eps &&
        crossmul(b.p1,b.p2,a.p1)*crossmul(b.p1,b.p2,a.p2)<=eps)
  5. //用叉乘判断两线段是否相交
        return true;
     return false;
    }
  6. int main()
    {
      while(scanf("%d",&n),n)
     {
      int i,j;
      for(i=1;i<=n;i++)
      {
       scanf("%lf%lf%lf%lf",&s[i].p1.x,&s[i].p1.y,&s[i].p2.x,&s[i].p2.y);
      }
      printf("Top sticks:");
      for(i=1;i<n;i++)
      {
       for(j=i+1;j<=n;j++)
       {
        if(cross(s[i],s[j])) break;
        if(j==n)
         printf(" %d,",i);
       }
      }
      printf(" %d./n",n);
     }
     return 0;
    }
原创粉丝点击