L. 斩

http://www.bnuoj.com/bnuoj/contest_show.php?cid=1605#problem/17966

#include<stdio.h>
#include<math.h>
int main()
{
    int _case;
    int x1,x2,y1,y2,a,b,c;
    double x,xp,xm,xn,ym,yp,yn;
    double su;
    scanf("%d",&_case);
    while(_case--)
    {
        scanf("%d %d %d %d %d %d %d",&x1,&y1,&x2,&y2,&a,&b,&c);
        if(a==0&&b!=0)
        {
            ym=-c/(double)b;
            su=(ym-y1)*(x2-x1);
            goto RE;
        }
        else if(b==0&&a!=0)
        {
            xm=-c/(double)a;
            su=(xm-x1)*(y2-y1);
            goto RE;
        }
        yp=(-a*x1-c)/(double)b;
        ym=(-a*x2-c)/(double)b;
        xp=(double)(-b*y1-c)/a;
        xm=(double)(-b*y2-c)/a;
        //printf("%lf\n",yp);
        if(yp>=y1&&yp<=y2&&ym>=y1&&ym<=y2)
        {
            ym=yp;
            yn=(double)(-a*x2-c)/b;
            su=fabs(ym+yn-2*y1)*(double)(x2-x1)/2;

        }
        else if(xp>=x1&&xp<=x2&&xm>=x1&&xm<=x2)
        {
            xm=xp;
            xn=(double)(-b*y2-c)/a;
            su=fabs(xm+xn-2*x1)*(double)(y2-y1)/2;
            //printf("%lf\n",su);
        }
        else
        {
            int l1=fabs(a*x1+b*y1+c);
            int l2=fabs(a*x2+b*y2+c);
            int l3=fabs(a*x1+b*y2+c);
            int l4=fabs(a*x2+b*y1+c);
            if(l1>=l2&&l1>=l3&&l1>=l4)
            {
                xm=(double)(-b*y2-c)/a;
                ym=(double)(-a*x2-c)/b;
                su=(double)(y2-ym)*(x2-xm)/2;
                //printf("%lf&&\n",su);
            }
            else if(l2>=l1&&l2>=l3&&l2>=l4)
            {
                xm=(double)(-b*y1-c)/a;
                ym=(double)(-a*x1-c)/b;
                su=(double)(y1-ym)*(x1-xm)/2;
                //printf("%lf**\n",su);
            }
            else if(l3>=l1&&l3>=l2&&l3>=l4)
            {
                xm=(double)(-b*y1-c)/a;
                ym=(double)(-a*x2-c)/b;
                su=(double)(y1-ym)*(x2-xm)/2;
            }
            else if(l4>=l1&&l4>=l2&&l4>=l3)
            {
                xm=(double)(-b*y2-c)/a;
                ym=(double)(-a*x1-c)/b;
                su=(double)(y2-ym)*(x1-xm)/2;
            }
        }
        RE: su=fabs(su);
        double min=(x2-x1)*(y2-y1)-su;
       // printf("%lf&&\n",min);
        if(su<min)
        printf("%.3lf\n",su);
        else
        printf("%.3lf\n",min);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/XDJjy/p/3052329.html