hdu 4720 计算几何简单题

昨天用vim练了一道大水题,今天特地找了道稍难一点的题。不过也不是很难,简单的计算几何而已。练习用vim编码,用gdb调试,结果居然1A了,没调试。。。囧。。。

做法很简单,无非就是两种情况:①三个巫师构成一个钝角(极限情况是直角)三角形,那么所画的圆应该是钝角所对边为直径的圆;②三个巫师构成一个锐角三角形,那么所画的圆应该是三角形的外接圆。

就这样纸,上了点模板,代码如下:

/*
 * Author    : ben
 */
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#include <stack>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <functional>
#include <numeric>
#include <cctype>
using namespace std;
typedef struct MyPoint {
    double x;
    double y;
    MyPoint(double xx, double yy) {
        x = xx;
        y = yy;
    }
    MyPoint() {
        x = y = 0;
    }
}MyPoint;

typedef struct MyLine {
    MyPoint a, b;
} MyLine;
MyPoint intersection(MyLine u, MyLine v) {
    MyPoint ret = u.a;
    double t = ((u.a.x - v.a.x) * (v.a.y - v.b.y)
            - (u.a.y - v.a.y) * (v.a.x - v.b.x))
            / ((u.a.x - u.b.x) * (v.a.y - v.b.y)
                    - (u.a.y - u.b.y) * (v.a.x - v.b.x));
    ret.x += (u.b.x - u.a.x) * t;
    ret.y += (u.b.y - u.a.y) * t;
    return ret;
}
//外心
MyPoint circumcenter(MyPoint a, MyPoint b, MyPoint c) {
    MyLine u, v;
    u.a.x = (a.x + b.x) / 2;
    u.a.y = (a.y + b.y) / 2;
    u.b.x = u.a.x - a.y + b.y;
    u.b.y = u.a.y + a.x - b.x;
    v.a.x = (a.x + c.x) / 2;
    v.a.y = (a.y + c.y) / 2;
    v.b.x = v.a.x - a.y + c.y;
    v.b.y = v.a.y + a.x - c.x;
    return intersection(u, v);
}
typedef struct MyCircle {
    MyPoint p;
    double r;
}MyCircle;

inline double dis(const MyPoint &p1, const MyPoint &p2) {
    return (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y);
}

MyCircle getCircle(MyPoint ps[]) {
    MyCircle ret;
    ret.r = -1;
    for(int i = 0; i < 3; i++) {
        MyPoint a = ps[i % 3];
        MyPoint b = ps[(i + 1) % 3];
        MyPoint c = ps[(i + 2) % 3];
        double x = (a.x + b.x) / 2;
        double y = (a.y + b.y) / 2;
        MyPoint t = MyPoint(x, y);
        double r = dis(a, b) / 4;
        double temp = dis(t, c);
        if(temp <= r) {
            ret.r = r;
            ret.p = t;
        }
    }
    if(ret.r != -1) {
        return ret;
    }
    ret.p = circumcenter(ps[0], ps[1], ps[2]);
    ret.r = dis(ret.p, ps[0]);
    return ret;
}

int main() {
//    freopen("data.in", "r", stdin);
    int T;
      double x, y;
    scanf("%d", &T);
    MyPoint wizards[3];
    MyPoint muggle;
    for(int t = 1; t <= T; t++) {
        for(int i = 0; i < 3; i++) {
            scanf("%lf%lf", &x, &y);
            wizards[i] = MyPoint(x, y);
        }
        scanf("%lf%lf", &x, &y);
        muggle = MyPoint(x, y);
        MyCircle c = getCircle(wizards);
        double d = dis(muggle, c.p);
        if(d <= c.r) {
            printf("Case #%d: Danger\n", t);
        } else {
            printf("Case #%d: Safe\n", t);
        }
    }
    return 0;
}

 

posted @ 2013-11-06 22:05  moonbay  阅读(243)  评论(0编辑  收藏  举报