- #include <iostream> 
- #include <cmath> 
- using namespace std; 
-   
- struct point //точка 
- { 
- 	double x; 
- 	double y; 
- }; 
- struct straight //прямая в виде общего уравнения Ax + By + C = 0 
- { 
- 	double A; 
- 	double B; 
- 	double C; 
- }; 
- straight create_straight (point A, point B) 
- { 
- 	straight s; 
- 	s.A = A.y - B.y; 
- 	s.B = B.x - A.x; 
- 	s.C = A.x * B.y - B.x * A.y; 
- 	return s; 
- } 
- double r (point A, point B) //расстояние между двумя точками 
- { 
- 	return sqrt((A.x - B.x)*(A.x - B.x)+(A.y - B.y)*(A.y - B.y)); 
- } 
- point projection (point A, point B, point C) // проекция точки С на прямую AB 
- { 
- 	double x = B.y - A.y; //x и y - координаты вектора, перпендикулярного к AB 
- 	double y = A.x - B.x; 
- 	double L = (A.x*B.y - B.x*A.y + A.y*C.x - B.y*C.x + B.x*C.y - A.x*C.y)/(x*(B.y - A.y) + y*(A.x - B.x)); 
- 	point H; 
- 	H.x = C.x + x * L; 
- 	H.y = C.y + y * L; 
- 	return H; 
- } 
- point intersection (straight a, straight b) //точка пересечения прямых a и b 
- { 
- 	point ans; 
- 	ans.x = (b.C*a.B - a.C*b.B)/(a.A*b.B - b.A*a.B); 
- 	ans.y = (a.C*b.A - b.C*a.A)/(b.B*a.A - a.B*b.A); 
- 	return ans; 
- } 
- void check_projection (point A, point B, point C, double & min_dis) 
- { 
- 	point H = projection(A,B,C); 
- 	if ((H.x >= min(A.x,B.x) && H.x <= max(A.x,B.x)) && (H.y >= min(A.y,B.y) && H.y <= max(A.y,B.y))) //проекция принадлежит отрезку 
- 	{ 
- 		if (r(H,C) < min_dis) 
- 		{ 
- 			min_dis = r(H,C); 
- 		} 
- 	} 
- } 
- double distance_if_not_intersect (point A, point B, point C, point D) //расстояние между отрезками, если они не пересекаются 
- { 
- 	double min_dis = min(min(r(A,C),r(A,D)),min(r(B,C),r(B,D))); 
- 	check_projection (A,B,C,min_dis); 
- 	check_projection (A,B,D,min_dis); 
- 	check_projection (C,D,A,min_dis); 
- 	check_projection (C,D,B,min_dis); 
- 	return min_dis; 
- } 
- int main() 
- { 
- 	point A,B,C,D; 
- 	cin>>A.x>>A.y>>B.x>>B.y>>C.x>>C.y>>D.x>>D.y; 
- 	straight AB = create_straight(A,B); 
- 	straight CD = create_straight(C,D); 
- 	if (AB.A/CD.A == AB.B/CD.B) //условие паралельности прямых 
- 	{ 
- 		cout<<distance_if_not_intersect(A,B,C,D); 
- 	} 
- 	else 
- 	{ 
- 		point H = intersection(AB,CD); 
- 		if ( (H.x >= min(A.x, B.x) && H.x <= max(A.x,B.x) && H.x >= min(C.x, D.x) && H.x <= max(C.x,D.x)) && //точка пересечения принадлежит обоим отрезкам 
- 		(H.y >= min(A.y, B.y) && H.y <= max(A.y,B.y) && H.y >= min(C.y, D.y) && H.y <= max(C.y,D.y)) ) 
- 		{ 
- 			cout<<0; 
- 		} 
- 		else 
- 		{ 
- 			cout<<distance_if_not_intersect(A,B,C,D); 
- 		} 
- 	} 
- 	return 0; 
- } 
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgcG9pbnQgLy/RgtC+0YfQutCwCnsKCWRvdWJsZSB4OwoJZG91YmxlIHk7Cn07CnN0cnVjdCBzdHJhaWdodCAvL9C/0YDRj9C80LDRjyDQsiDQstC40LTQtSDQvtCx0YnQtdCz0L4g0YPRgNCw0LLQvdC10L3QuNGPIEF4ICsgQnkgKyBDID0gMAp7Cglkb3VibGUgQTsKCWRvdWJsZSBCOwoJZG91YmxlIEM7Cn07CnN0cmFpZ2h0IGNyZWF0ZV9zdHJhaWdodCAocG9pbnQgQSwgcG9pbnQgQikKewoJc3RyYWlnaHQgczsKCXMuQSA9IEEueSAtIEIueTsKCXMuQiA9IEIueCAtIEEueDsKCXMuQyA9IEEueCAqIEIueSAtIEIueCAqIEEueTsKCXJldHVybiBzOwp9CmRvdWJsZSByIChwb2ludCBBLCBwb2ludCBCKSAvL9GA0LDRgdGB0YLQvtGP0L3QuNC1INC80LXQttC00YMg0LTQstGD0LzRjyDRgtC+0YfQutCw0LzQuAp7CglyZXR1cm4gc3FydCgoQS54IC0gQi54KSooQS54IC0gQi54KSsoQS55IC0gQi55KSooQS55IC0gQi55KSk7Cn0KcG9pbnQgcHJvamVjdGlvbiAocG9pbnQgQSwgcG9pbnQgQiwgcG9pbnQgQykgLy8g0L/RgNC+0LXQutGG0LjRjyDRgtC+0YfQutC4INChINC90LAg0L/RgNGP0LzRg9GOIEFCCnsKCWRvdWJsZSB4ID0gQi55IC0gQS55OyAvL3gg0LggeSAtINC60L7QvtGA0LTQuNC90LDRgtGLINCy0LXQutGC0L7RgNCwLCDQv9C10YDQv9C10L3QtNC40LrRg9C70Y/RgNC90L7Qs9C+INC6IEFCCglkb3VibGUgeSA9IEEueCAtIEIueDsKCWRvdWJsZSBMID0gKEEueCpCLnkgLSBCLngqQS55ICsgQS55KkMueCAtIEIueSpDLnggKyBCLngqQy55IC0gQS54KkMueSkvKHgqKEIueSAtIEEueSkgKyB5KihBLnggLSBCLngpKTsKCXBvaW50IEg7CglILnggPSBDLnggKyB4ICogTDsKCUgueSA9IEMueSArIHkgKiBMOwoJcmV0dXJuIEg7Cn0KcG9pbnQgaW50ZXJzZWN0aW9uIChzdHJhaWdodCBhLCBzdHJhaWdodCBiKSAvL9GC0L7Rh9C60LAg0L/QtdGA0LXRgdC10YfQtdC90LjRjyDQv9GA0Y/QvNGL0YUgYSDQuCBiCnsKCXBvaW50IGFuczsKCWFucy54ID0gKGIuQyphLkIgLSBhLkMqYi5CKS8oYS5BKmIuQiAtIGIuQSphLkIpOwoJYW5zLnkgPSAoYS5DKmIuQSAtIGIuQyphLkEpLyhiLkIqYS5BIC0gYS5CKmIuQSk7CglyZXR1cm4gYW5zOwp9CnZvaWQgY2hlY2tfcHJvamVjdGlvbiAocG9pbnQgQSwgcG9pbnQgQiwgcG9pbnQgQywgZG91YmxlICYgbWluX2RpcykKewoJcG9pbnQgSCA9IHByb2plY3Rpb24oQSxCLEMpOwoJaWYgKChILnggPj0gbWluKEEueCxCLngpICYmIEgueCA8PSBtYXgoQS54LEIueCkpICYmIChILnkgPj0gbWluKEEueSxCLnkpICYmIEgueSA8PSBtYXgoQS55LEIueSkpKSAvL9C/0YDQvtC10LrRhtC40Y8g0L/RgNC40L3QsNC00LvQtdC20LjRgiDQvtGC0YDQtdC30LrRgwoJewoJCWlmIChyKEgsQykgPCBtaW5fZGlzKQoJCXsKCQkJbWluX2RpcyA9IHIoSCxDKTsKCQl9Cgl9Cn0KZG91YmxlIGRpc3RhbmNlX2lmX25vdF9pbnRlcnNlY3QgKHBvaW50IEEsIHBvaW50IEIsIHBvaW50IEMsIHBvaW50IEQpIC8v0YDQsNGB0YHRgtC+0Y/QvdC40LUg0LzQtdC20LTRgyDQvtGC0YDQtdC30LrQsNC80LgsINC10YHQu9C4INC+0L3QuCDQvdC1INC/0LXRgNC10YHQtdC60LDRjtGC0YHRjwp7Cglkb3VibGUgbWluX2RpcyA9IG1pbihtaW4ocihBLEMpLHIoQSxEKSksbWluKHIoQixDKSxyKEIsRCkpKTsKCWNoZWNrX3Byb2plY3Rpb24gKEEsQixDLG1pbl9kaXMpOwoJY2hlY2tfcHJvamVjdGlvbiAoQSxCLEQsbWluX2Rpcyk7CgljaGVja19wcm9qZWN0aW9uIChDLEQsQSxtaW5fZGlzKTsKCWNoZWNrX3Byb2plY3Rpb24gKEMsRCxCLG1pbl9kaXMpOwoJcmV0dXJuIG1pbl9kaXM7Cn0KaW50IG1haW4oKQp7Cglwb2ludCBBLEIsQyxEOwoJY2luPj5BLng+PkEueT4+Qi54Pj5CLnk+PkMueD4+Qy55Pj5ELng+PkQueTsKCXN0cmFpZ2h0IEFCID0gY3JlYXRlX3N0cmFpZ2h0KEEsQik7CglzdHJhaWdodCBDRCA9IGNyZWF0ZV9zdHJhaWdodChDLEQpOwoJaWYgKEFCLkEvQ0QuQSA9PSBBQi5CL0NELkIpIC8v0YPRgdC70L7QstC40LUg0L/QsNGA0LDQu9C10LvRjNC90L7RgdGC0Lgg0L/RgNGP0LzRi9GFCgl7CgkJY291dDw8ZGlzdGFuY2VfaWZfbm90X2ludGVyc2VjdChBLEIsQyxEKTsKCX0KCWVsc2UKCXsKCQlwb2ludCBIID0gaW50ZXJzZWN0aW9uKEFCLENEKTsKCQlpZiAoIChILnggPj0gbWluKEEueCwgQi54KSAmJiBILnggPD0gbWF4KEEueCxCLngpICYmIEgueCA+PSBtaW4oQy54LCBELngpICYmIEgueCA8PSBtYXgoQy54LEQueCkpICYmIC8v0YLQvtGH0LrQsCDQv9C10YDQtdGB0LXRh9C10L3QuNGPINC/0YDQuNC90LDQtNC70LXQttC40YIg0L7QsdC+0LjQvCDQvtGC0YDQtdC30LrQsNC8CgkJKEgueSA+PSBtaW4oQS55LCBCLnkpICYmIEgueSA8PSBtYXgoQS55LEIueSkgJiYgSC55ID49IG1pbihDLnksIEQueSkgJiYgSC55IDw9IG1heChDLnksRC55KSkgKQoJCXsKCQkJY291dDw8MDsKCQl9CgkJZWxzZQoJCXsKCQkJY291dDw8ZGlzdGFuY2VfaWZfbm90X2ludGVyc2VjdChBLEIsQyxEKTsKCQl9Cgl9CglyZXR1cm4gMDsKfQ==