标签:代码 ++ pre targe type rabl return done fabs
链接:https://codeforces.com/contest/1078
题意:
给出一个在二维平面直角坐标系第一象限内的,单位长度为 $1$ 的无限大网格,每条直线都代表道路。又给你一条直线 $ax+by+c=0$,也代表一条道路。
现在给你两个格点坐标 $(x_1,y_1)$ 和 $(x_2,y_2)$,让你求该两点间最短的道路距离。
题解:
一个矩形,它的四条边无限延长,跟另外一条直线,会产生两个(直线水平或竖直)或者四个交点(直线倾斜),计算出这个些点,然后算出所有可能的走法的长度即可。
AC代码:
#include<bits/stdc++.h> using namespace std; typedef pair<double,double> pff; const double eps=1e-10; double a,b,c; pff p1,p2; pff q1,q2,q3,q4; double ans,ans1,ans2,ans3,ans4; inline double dist(const pff& a,const pff& b) { return sqrt(pow(a.first-b.first,2)+pow(a.second-b.second,2)); } inline double min(double a,double b,double c,double d,double e) { double res=a; res=min(res,b); res=min(res,c); res=min(res,d); res=min(res,e); return res; } int main() { ans=ans1=ans2=ans3=ans4=1e12; cin>>a>>b>>c>>p1.first>>p1.second>>p2.first>>p2.second; ans=fabs(p1.first-p2.first)+fabs(p1.second-p2.second); if(fabs(a)<eps) { q1=make_pair(p1.first,-c/b); q2=make_pair(p2.first,-c/b); ans1=dist(p1,q1)+dist(q1,q2)+dist(q2,p2); } else if(fabs(b)<eps) { q1=make_pair(-c/a,p1.second); q2=make_pair(-c/a,p2.second); ans2=fabs(p1.first-q1.first)+dist(q1,q2)+fabs(p2.first-q2.first); } else { q1=make_pair(p1.first,-(a*p1.first+c)/b); q3=make_pair(-(b*p1.second+c)/a,p1.second); q2=make_pair(p2.first,-(a*p2.first+c)/b); q4=make_pair(-(b*p2.second+c)/a,p2.second); ans1=dist(p1,q1)+dist(q1,q2)+dist(q2,p2); ans2=dist(p1,q1)+dist(q1,q4)+dist(q4,p2); ans3=dist(p1,q3)+dist(q3,q2)+dist(q2,p2); ans4=dist(p1,q3)+dist(q3,q4)+dist(q4,p2); } printf("%.10f\n",min(ans,ans1,ans2,ans3,ans4)); }
题意:
Codeforces 1078 - A/B/C/D/E - (Undone)
标签:代码 ++ pre targe type rabl return done fabs
原文地址:https://www.cnblogs.com/dilthey/p/9998768.html