An Easy Problem?!--

没过  没过   啊啊啊  wa到死

http://poj.org/problem?id=2826

我的错误代码

先不写了!!!!!!!

#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
using namespace std;
#define INF 0xfffffff
#define ESP 1e-8

#define memset(a,b) memset(a,b,sizeof(a))

#define N 10

struct Point
{
    double x,y;
    Point(double x=0,double y=0):x(x),y(y){}
    Point operator - (const Point &t)const{
        return Point(x-t.x,y-t.y);
    }
    int operator * (const Point &temp)const{
        double t=(x*temp.y-y*temp.x);
        if(t>ESP)
            return 1;
        if(fabs(t)<ESP)
            return 0;
        return -1;
    }
}t;

struct node
{
    Point A,B;
    node(Point A=0,Point B=0):A(A),B(B){}
};

int jiao(node a,node b)
{
    int k1=(b.A-a.A)*(a.B-a.A)+(b.B-a.A)*(b.B-a.A);
    int k2=(a.A-b.A)*(b.B-b.A)+(a.B-b.A)*(b.B-b.A);
    if(k1==2 || k2==2)
        return false;
    return true;
}

int gongxian(node a,node b)
{
    int k1=(b.A-a.A)*(a.B-a.A);
    int k2=(b.B-a.A)*(b.B-a.A);
    if(k1==0 && k2==0)
        return true;
    return false;
}

int fugai(double x1,double x2,double y1,double y2)
{
    Point p,q;
    p=Point(x1,y1);
    q=Point(x2,y2);
    int k1=(p-t)*(q-t);
    int k2=(q-t)*(p-t);
    if(t.x<=x1)
    {
        if(x1>=x2 && y1>y2 && (k2==1 || k2==0))
            return true;
        else if(x2>=x1 && y2>y1 && (k1==1 || k1==0))
            return true;
    }
    else if(t.x>=x1)
    {
        if(x1<=x2 && y1>y2 && (k2==-1 || k2==0))
            return true;
        else if(x2<=x1 && y2>y1 && (k1==-1 || k1==0))
            return true;
    }
    return false;
}
Point line(Point u1,Point u2,Point v1,Point v2)///求交点模板
{
    Point ret=u1;
    double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))/((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));

    ret.x+=(u2.x-u1.x)*t;
    ret.y+=(u2.y-u1.y)*t;

    return ret;
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        double ans=0.00;
        node a[N];
        Point p[N];
        memset(a,0);
        memset(p,0);
        double x1,x2,x3,x4,y1,y2,y3,y4;
        scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
        scanf("%lf %lf %lf %lf",&x3,&y3,&x4,&y4);
        if(y1<y2)
        {
            swap(x1,x2);
            swap(y1,y2);
        }
        if(y3<y4)
        {
            swap(x3,x4);
            swap(y3,y4);
        }
        p[1]=Point(x1,y1);
        p[2]=Point(x2,y2);
        p[3]=Point(x3,y3);
        p[4]=Point(x4,y4);
        a[1]=node(Point(x1,y1),Point(x2,y2));
        a[2]=node(Point(x3,y3),Point(x4,y4));
        ///判断是否与x轴平行
        if(fabs(y1-y2)<ESP || fabs(y3-y4)<ESP)
        {
            printf("%.2f
",ans+ESP);
            continue;
        }
        ///判断相交
        if(!jiao(a[1],a[2]))
        {
            printf("%.2f
",ans+ESP);
            continue;
        }

        ///判断共线
        if(gongxian(a[1],a[2]))
        {
            printf("%.2f
",ans+ESP);
            continue;
        }

        ///判断覆盖
        t=line(p[1],p[2],p[3],p[4]);
        if(fugai(x1,x3,y1,y3))
        {
            printf("%.2f
",ans+ESP);
            continue;
        }
        else
        {
            double y=min(y1,y3);
            double xx1=(x2-x1)*(y-y1)/(y2-y1)+x1;
            double xx2=(x4-x3)*(y-y3)/(y4-y3)+x3;

            double S=fabs((y-t.y)*(xx2-t.x)-(xx1-t.x)*(y-t.y))/2.0;
            printf("%.2f
",S+ESP);
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/linliu/p/5473039.html