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; }