这是我们校内赛里的比赛里的题目。。。赛后做了。。。太坑了。。做了快两小时。。一开始没有考虑到A B点在直线不同侧的情况。例子怎么都过不了。。现在终于做出来了。。好久没有这么爽的感觉了。。。
题意:给出斜率K和A B C三个点的坐标。有一条斜率为K并经过点C的直线。在直线上取一点P,求min|AP+BP|。
分两种情况: A B不同侧和同侧 (对称点的坐标公式在网上找的)
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int main()
{
double k, ax,ay,bx,by,cx,cy,dx,dy;
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lf%lf%lf%lf%lf%lf%lf",&k,&ax,&ay,&bx,&by,&cx,&cy);
double c=-k*cx+cy;
double a=k;
double b=-1;
//dx=((b*b-a*a)*ax-2*a*b*ay-2*a*c)/(a*a+b*b);
// dy=((a*a-b*b)*ay-2*a*b*ax-2*c*b)/(a*a+b*b);
if((a*ax+b*ay+c)*(a*bx+b*by+c)>=0)
{
dx=ax-(2*a*(a*ax+b*ay+c))/(a*a+b*b);
dy=ay-(2*b*(a*ax+b*ay+c))/(a*a+b*b);
double dis=sqrt((dx-bx)*(dx-bx)+(dy-by)*(dy-by));
printf("%.2lf\n",dis);
}
else
{
printf("%.2lf\n",sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by)));
}
}
return 0;
}