又是山羊~~~
这次呢,它不吃草啦,要吃菠萝。。。
就是求点到线段的最短和最长距离。如果最短距离比L大,输出L - MIN 否则输出0。最长距离也是。
求最短距离直接套模板啦,其实也就是比较如果垂足在线段上的话的话,垂直距离最近。如果不在的话,比较到两端点的距离。
最远距离就是点到两端点的最远距离。
WA在17组数据了,看了DISCUSS (啊。。。坏习惯T T ) 没考虑线段是一个点的情况,特判下就好了。
#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> using namespace std; const double eps = 1e-6; struct point{ double x,y;}; double crossProduct(point a,point b,point c)//向量 ac 在 ab 的方向 { return (c.x - a.x)*(b.y - a.y) - (b.x - a.x)*(c.y - a.y); } double crossProduct(double x0,double y0,double x1,double y1,double x2,double y2) { return (x2 - x0)*(y1 - y0) - (x1 - x0)*(y2 - x0); } double disp2p(point a,point b) { return sqrt( ( a.x - b.x ) * ( a.x - b.x ) + ( a.y - b.y ) * ( a.y - b.y ) ); } bool dy(double x,double y) { return x > y + eps;} // x > y bool xy(double x,double y) { return x < y - eps;} // x < y bool dyd(double x,double y) { return x > y - eps;} // x >= y bool xyd(double x,double y) { return x < y + eps;} // x <= y bool dd(double x,double y) { return fabs( x - y ) < eps;} // x == y point intersection(point u1,point u2,point v1,point v2) { point ans = 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)); ans.x += (u2.x - u1.x)*t; ans.y += (u2.y - u1.y)*t; return ans; } point p2seg(point p,point l1,point l2) { point t = p; t.x += l1.y - l2.y; t.y += l2.x - l1.x; if( crossProduct(l1,t,p)*crossProduct(l2,t,p) > eps ) return disp2p(p,l1) < disp2p(p,l2) ? l1 : l2; return intersection(p,t,l1,l2); } int main() { point a,b,c,d; double L; scanf("%lf%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y,&L); if( dd(a.x,b.x) && dd(a.y,b.y) ) d = a; else d = p2seg(c,a,b); double mmin = disp2p(c,d); if( xy(mmin,L) ) printf("0.00/n"); else printf("%.2lf/n",mmin - L); double mmax = ( dy(disp2p(c,a),disp2p(c,b)) ? disp2p(c,a) : disp2p(c,b) ); if( xy(mmax,L) ) printf("0.00/n"); else printf("%.2lf/n",mmax - L); return 0; }