给4个点求两线段相交(水)

好几天没写博客啦,我们数字逻辑课程要考试了,现在的我还啥也不会哈哈,要从头开始复习,等俺考完数字逻辑,再更嘿嘿。

好吧,这次也要拿出八百年前写的代码了。。。
题意就是给你许多个两个点,这两个点构成一条线段,求线段相交的对数
两线段不会重合的

样例输入

3
0.00 0.00 1.00 1.00
0.00 1.00 1.00 0.00
0.00 0.00 1.00 0.00

样例输出

3

我是先剪枝,考虑多种情况
1、先判断平行的情况,平行永不相交
2、对于两条线段,如果一条线段上的x值最大的点小于另一条线段上的x值最小的点的值,同理y也是,这种情况也不会相交。
3、剪完之后,求两线段所在直线方程,带入看是否相交。。。

蛮水的一道题,错了10几次哈哈,好菜呀我。。。。。。。

代码

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
struct qq{
    double x,y,x1,y1;
}q[150];
int main()
{
    int n;
    int ans=0;
    double my,mx,mmx,mmy;
    double zx,zy,zzx,zzy;
    double k1,k2,b1,b2;
    ans=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%lf %lf %lf %lf",&q[i].x,&q[i].y,&q[i].x1,&q[i].y1);
    }
    for(int i=0;i<n-1;i++)
    {
        for(int j=i+1;j<n;j++)
        {
            k1=(q[i].y1-q[i].y)/(q[i].x1-q[i].x);
            k2=(q[j].y1-q[j].y)/(q[j].x1-q[j].x);
            b1=(q[i].x*q[i].y1-q[i].x1*q[i].y)/(q[i].x-q[i].x1);
            b2=(q[j].x*q[j].y1-q[j].x1*q[j].y)/(q[j].x-q[j].x1);
            if(k1==k2)
            {continue;}
            if((q[i].x==q[j].x&&q[i].y==q[j].y)||(q[i].x==q[j].x1&&q[i].y==q[j].y1)||(q[i].x1==q[j].x&&q[i].y1==q[j].y)||(q[i].x1==q[j].x1&&q[i].y1==q[j].y1))
            {ans++;
            continue;}
            mx=min(q[i].x,q[i].x1);
            mmx=max(q[i].x,q[i].x1);
            my=min(q[i].y,q[i].y1);
            mmy=max(q[i].y,q[i].y1);
            zx=min(q[j].x,q[j].x1);
            zzx=max(q[j].x,q[j].x1);
            zy=min(q[j].y,q[j].y1);
            zzy=max(q[j].y,q[j].y1);
            if(mx>zzx||zx>mmx||my>zzy||zy>mmy)
            {continue;}
            double kk1,kk2;
            kk1=k1*q[j].x+b1;
            kk2=k1*q[j].x1+b1;
            if(kk2>q[j].y1&&kk1>q[j].y || kk2<q[j].y1&&kk1<q[j].y)
            {continue;}
            double pp1,pp2;
            pp1=k2*q[i].x+b2;
            pp2=k2*q[i].x1+b2;
            if(pp2>q[i].y1&&pp1>q[i].y || pp2<q[i].y1&&pp1<q[i].y)
            {continue;}
            ans++;
        }
    }
    printf("%d\n",ans);
    return 0;
}

之后一个星期可能不更博了,反正没人看。。。。
备考数字逻辑了,祝我考个好成绩吧!
加油哦

你可能感兴趣的:(题解)