poj 2653

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

 

      以下是代码:

 

  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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值