zoukankan      html  css  js  c++  java
  • 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
    ", t);
            } else {
                printf("Case #%d: Safe
    ", t);
            }
        }
        return 0;
    }
  • 相关阅读:
    meta标签中的http-equiv属性使用介绍
    MySQL中批量执行SQL语句
    <fmt:formatNumber/>显示不同地区的各种数据格式
    <fmt:setBundle/>标签
    <fmt:bundle/>、<fmt:message/>、<fmt:param/>资源国际化
    <fmt:setTimeZone/>设置时区
    <fmt:timeZone/>显示全球时间
    初识Storm
    storm安装及启动
    HBase API 的使用(一)
  • 原文地址:https://www.cnblogs.com/moonbay/p/3411391.html
Copyright © 2011-2022 走看看