查看完整版本: PKU2504 Rounding Box解题报告源代码

Teacher 2008-9-20 22:58

PKU2504 Rounding Box解题报告源代码

[url=http://www.608088.com/][color=#036bd9][/color][/url] [url=http://www.608088.com/index.php?tag=%BD%E2%CC%E2%B1%A8%B8%E6][color=#036bd9][/color][/url]
[color=#036bd9][/color]
Bounding box Time Limit: 1.0 Seconds   Memory Limit: 65536K
Total Runs: 28   Accepted Runs: 14    Multiple test files

The Archeologists of the Current Millenium (ACM) now and then discover ancient artifacts located at vertices of regular polygons. The moving sand dunes of the desert render the excavations difficult and thus once three vertices of a polygon are discovered there is a need to cover the entire polygon with protective fabric.

Input contains multiple cases. Each case describes one polygon. It starts with an integer n ≤ 50, the number of vertices in the polygon, followed by three pairs of real numbers giving the x and y coordinates of three vertices of the polygon. The numbers are separated by whitespace. The input ends with a n equal 0, this case should not be processed.

For each line of input, output one line in the format shown below, giving the smallest area of a rectangle which can cover all the vertices of the polygon and whose sides are parallel to the x and y axes.
Sample input

4
10.00000 0.00000
0.00000 -10.00000
-10.00000 0.00000
6
22.23086 0.42320
-4.87328 11.92822
1.76914 27.57680
23
156.71567 -13.63236
139.03195 -22.04236
137.96925 -11.70517
0

Output for the sample input

Polygon 1: 400.000Polygon 2: 1056.172Polygon 3: 397.673


// solution by alpc12
#include <cstdio>
#include <cmath>

const double EPS = 1e-8;
const double PI = acos(-1.0);
const double INF = 1e100;

#define Min(a, b) (a<b?a:b)
#define Max(a, b) (a>b?a:b)

struct Point {
    double x;
    double y;
    Point() {}
    Point(double xx, double yy) {
        x = xx;
        y = yy;
    }
};

struct Line {
    double a, b, c;
    Point st, end;
    Line() {}
    Line(Point& u, Point& v) {
        st = u;
        end = v;
        a = v.y - u.y;
        b = u.x - v.x;
        c = a*u.x + b*u.y;
    }
};

#define sqr(a) ((a)*(a))
#define dist(a, b) (sqrt( sqr((a).x-(b).x)+sqr((a).y-(b).y) ))
#define cross(a, b, c)  (((b).x-(a).x)*((c).y-(a).y)-((b).y-(a).y)*((c).x-(a).x))

inline int dblcmp(double a, double b = 0.0) {
    if(fabs(a-b) < EPS) return 0;
    return a < b ? -1 : 1;
}

Line bisector(Point& a, Point& b) {
    Line line(a, b), ans;   
    double midx = (a.x+b.x)/2, midy = (a.y+b.y)/2;
    ans.a = -line.b, ans.b = line.a, ans.c = ans.a*midx + ans.b*midy;
    return ans;
}

int line_line_intersect(Line& l1, Line& l2, Point& s) {
    double det = l1.a * l2.b - l2.a * l1.b;
    if(dblcmp(det) == 0) {
        return -1;
    }
    s.x = (l2.b*l1.c - l1.b*l2.c) / det;
    s.y = (l1.a*l2.c - l2.a*l1.c) / det;
    return 1;
}

int center_3point(Point& a, Point& b, Point& c, Point& s, double& r) {
    Line x = bisector(a, b), y = bisector(b, c);
    if(line_line_intersect(x, y, s) == 1) {
        r = dist(s, a);
        return 1;
    }
    return 0;
}

Point p[55];

int main() {

    //freopen("t.in", "r", stdin);

    int i, n, tc = 0;
    Point cent;
    while(scanf("%d", &n), n) {
        for(i = 0; i < 3; ++i) scanf("%lf %lf ", &p.x, &p.y);
        double r;
        if(center_3point(p[0], p[1], p[2], cent, r) == 1) {
            for(i = 0; i < 3; ++i)
                p.x -= cent.x, p.y -= cent.y;
        }
        double alpha = acos(p[0].x / r);
        double theta = 2 * PI / n;
        double xmin = INF, xmax = -INF, ymin = INF, ymax = -INF;
        for(i = 0; i < n; ++i) {
            p = Point(r * cos(alpha + i * theta),
                r * sin(alpha + i * theta));
            xmin = Min(xmin, p.x);
            xmax = Max(xmax, p.x);
            ymin = Min(ymin, p.y);
            ymax = Max(ymax, p.y);
        }
        printf("Polygon %d: %.3lf\n", ++tc, (xmax-xmin)*(ymax-ymin));
    }
    return 0;
}
页: [1]
查看完整版本: PKU2504 Rounding Box解题报告源代码