📄 1079.cpp
字号:
/* This Code is Submitted by wywcgs for Problem 1079 on 2006-02-08 at 14:58:44 */
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const double eps = 1e-5;
const double SQRT_3 = sqrt(3.0);
typedef pair<int, int> pii;
double total, l, e;
inline double dis(double, double, double, double);
pii parse(double, double);
int main()
{
int i;
double x[2], y[2];
pii o[2];
while(scanf("%lf", &l) != EOF && fabs(l) > eps) {
total = 0; e = SQRT_3 * l;
for(i = 0; i < 2; i++) {
scanf("%lf %lf", &x[i], &y[i]);
o[i] = parse(x[i], y[i]);
}
int step = max(abs(o[0].first-o[1].first), abs(o[0].second-o[1].second));
total += e*step;
printf("%.3lf\n", step == 0 ? dis(x[0], y[0], x[1], y[1]) : total);
}
return 0;
}
inline double dis(double x1, double y1, double x2, double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
pii parse(double x, double y)
{
int n = (int)floor(x/3/l);
int mr = 2*n+1, muc = (int)(y/e)*2+1, mdc = muc-2;
double mx = (3*n+1.5)*l, muy = muc*e/2, mdy = muy-e;
double cx = mx-1.5*l, cy = muy-e/2;
int r = mr-1, c = muc-1;
if(dis(cx, cy, x, y) > dis(mx+1.5*l, cy, x, y)) cx = mx+1.5*l, r = mr+1;
if(dis(cx, cy, x, y) > dis(mx, muy, x, y)) cx = mx, cy = muy, r = mr, c = muc;
if(dis(cx, cy, x, y) > dis(mx, mdy, x, y)) cx = mx, cy = mdy, r = mr, c = mdc;
total += dis(cx, cy, x, y);
return pii(r, c);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -