// UVa 218 - Moth Eradication
#include <iostream>
#include <algorithm>
#include <vector>
#include <math.h>
#include <stdio.h>
using namespace std;
struct point {
double x, y;
double angle;
};
vector<point> p;
bool operator <(point a, point b) {
return a.angle < b.angle;
}
double ccw(point p0, point p1, point p2) {
return (p1.x - p0.x) * (p2.y - p0.y) - (p1.y - p0.y) * (p2.x - p0.x);
}
void swap(int i, int j) {
point c = p[i];
p[i] = p[j];
p[j] = c;
}
int main() {
int n, t = 0;
while (cin >> n && n) {
t++;
p.clear();
int mn = 0;
for (int i = 0; i < n; i++) {
double x, y;
cin >> x >> y;
p.push_back( { x, y, 0 });
if (p[i].y < p[mn].y || (p[i].y == p[mn].y && p[i].x < p[mn].x))
mn = i;
}
p.push_back(p[0]);
if (mn == 0)
mn = n;
swap(1, mn);
for (int i = 2; i <= n; i++) {
if (p[i].x == p[1].x)
p[i].angle = M_PI / 2;
else {
p[i].angle = atan((p[i].y - p[1].y) / (p[i].x - p[1].x));
while (p[i].angle < 0)
p[i].angle += M_PI;
}
}
sort(p.begin() + 2, p.end());
p[0] = p[n];
int m = 1;
for (int i = 2; i <= n; i++) {
while (ccw(p[m - 1], p[m], p[i]) <= 0) {
if (m > 1)
m--;
else if (i == n)
break;
else
i++;
}
m++;
swap(m, i);
}
double P = 0;
//p[0] = p[m];
if (t > 1)
cout << endl;
printf("Region #%d:\n", t);
for (int i = m; i > 0; i--) {
printf("(%.1f,%.1f)-", p[i].x, p[i].y);
P += sqrt((p[i].x - p[i - 1].x) * (p[i].x - p[i - 1].x) + (p[i].y - p[i - 1].y) * (p[i].y - p[i - 1].y));
}
printf("(%.1f,%.1f)\n", p[0].x, p[0].y);
printf("Perimeter length = %.2f\n", P);
}
return 0;
}
Wednesday, May 13, 2015
UVa 218 - Moth Eradication
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment