牛栓绳
牛栓绳
半个月之前Alice买了一些竹竿,现在又买了一头牛。Alice为了防止牛逃跑,用竹竿做一根拴牛的桩子,并用一条绳子把牛拴在桩上。这条绳子不能太长,不然牛可能进到Alice的矩形庄稼地里吃掉农作物。所以Alice要把拴牛绳剪成合适的长度。
在坐标系中,坐标(x,y)表示拴牛桩的位置。用左下角顶点(x1,y1)和右上角顶点 (x2,y2)所围矩形表示Alice的庄稼地。给出三个坐标,分别表示拴牛桩、庄稼地左下角、庄稼地右上角的位置,请你计算使牛不能进入庄稼地的拴牛绳最大长度。
输出允许误差0.01
数据输入
6个以空格分开的整数,分别表示 x y x1 y1 x2 y2
所有输入数字都是[-999,999]范围内的整数.
题目保证x1≤x2 且y1≤y2
题目保证栓牛桩不在矩形庄稼的区域内
数据输出
输出格式
输出只有一行,一个浮点数表示拴牛绳的最大长度
样例1
输入样例
7 3 0 0 5 4
输出样例
2.0
样例2
输入样例
6 0 0 2 7 6
输出样例
2.0
样例3
输入样例
3 -4 -3 -1 -1 2
输出样例
5.0
代码
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100
#define eps 1e-8
#define zero(x)(((x)>0?(x):-(x))<eps)
struct point{
double x,y;
};
struct line{
point a,b;
};
double xmult(point p1,point p2, point p0){
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
double distance(point p1, point p2){//两点之间的距离
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));//绝对值
}
double disptoline(point p, line l){//点到直线的距离
return fabs(xmult(p,l.a,l.b))/distance(l.a,l.b);
}
int main(void){
point t,a,b,c,d;
double dis_temp=0.0,dis=0.0;
cin>>t.x>>t.y>>a.x>>a.y>>c.x>>c.y;
d.x=a.x;
d.y=c.y;
b.x=c.x;
b.y=a.y;
// line dvjc={a,c};
// dis=disptoline(d, dvjc);
// dis_temp=disptoline(t, dvjc);
if(a.x<=t.x && t.x<=c.x)
dis=min(fabs(t.y-a.y),fabs(t.y-c.y));
else if(a.y<=t.y && t.y<=c.y)
dis=min(fabs(t.x-a.x),fabs(t.x-c.x));
else if(t.x<a.x){
if(t.y>c.y)
dis=distance(t,d);
else
dis=distance(t,a);
}
else {
if(t.y>c.y)
dis=distance(t,c);
else
dis=distance(t,b);
}
printf("%.1f",dis);
return 0;
}