Run Time: 0.000
Ranking (as of 2016-10-05): 8 out of 378
Language: C++11
/*
UVa 10964 - Strange Planet
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_10964_Strange_Planet.cpp
*/
#include <cstdio>
#include <cmath>
void get_coordinate(int c, int& x, int& y)
{
int d = static_cast<int>((1.0 + sqrt(1.0 + static_cast<double>(c) * 2.0)) / 2.0);
// c is in the d-th diamond shape from the origin
if (2 * d * (d - 1) == c)
d--;
x = 1 - d, y = 1;
int c_min = 2 * d * (d - 1) + 1, c_max = c_min + d - 1;
if (c <= c_max)
x += c - c_min, y += c - c_min;
else {
x += c_max - c_min, y += c_max - c_min;
c_min = c_max, c_max += d;
if (c <= c_max)
x += c - c_min, y -= c - c_min;
else {
x += c_max - c_min, y -= c_max - c_min;
c_min = c_max, c_max += d;
if (c <= c_max)
x -= c - c_min, y -= c - c_min;
else {
x -= c_max - c_min, y -= c_max - c_min;
c_min = c_max, c_max += d;
x -= c - c_min, y += c - c_min;
}
}
}
#ifdef DEBUG
printf("%d: (%d, %d)\n", c, x, y);
#endif
}
int main()
{
while (true) {
int a, b;
scanf("%d %d", &a, &b);
if (a == -1)
break;
int ax, ay, bx, by;
get_coordinate(a, ax, ay);
get_coordinate(b, bx, by);
printf("%.2lf\n", hypot(static_cast<double>(ax - bx), static_cast<double>(ay - by)));
}
return 0;
}
No comments:
Post a Comment