牛栓绳

牛栓绳

半个月之前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;
}

posted @ 2019-03-13 10:30  lingr7  阅读(354)  评论(0编辑  收藏  举报