首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

POJ 2826 An Easy Problem?

2013-10-27 
POJ 2826 An Easy Problem?!这题的恶心程度一流。卡精度貌丧心病狂。。WA了一版。最后G过不了,C过的。考虑好DIS

POJ 2826 An Easy Problem?!

这题的恶心程度一流。

卡精度貌似丧心病狂。。

WA了一版。

最后G++过不了,C++过的。

考虑好DISCUSS中的情况基本就行了、

#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>#include <cstdlib>#include <cmath>#include <map>#include <sstream>#include <queue>#include <vector>#define MAXN 100005#define MAXM 211111#define eps 1e-8#define INF 50000001using namespace std;inline int dblcmp(double d){    if(fabs(d) < eps) return 0;    return d > eps ? 1 : -1;}struct point{    double x, y;    point(){}    point(double _x, double _y): x(_x), y(_y) {}    void input()    {        scanf("%lf%lf", &x, &y);    }    bool operator ==(point a)const    {        return dblcmp(a.x - x) == 0 && dblcmp(a.y - y) == 0;    }    point sub(point p)    {        return point(x - p.x, y - p.y);    }    double dot(point p)    {        return x * p.x + y * p.y;    }    double det(point p)    {        return x * p.y - y * p.x;    }    double distance(point p)    {        return hypot(x - p.x, y - p.y);    }};struct line{    point a, b;    line(){}    line(point _a, point _b){ a = _a; b = _b;}    void input()    {        a.input();        b.input();    }    int segcrossseg(line v)    {        int d1 = dblcmp(b.sub(a).det(v.a.sub(a)));        int d2 = dblcmp(b.sub(a).det(v.b.sub(a)));        int d3 = dblcmp(v.b.sub(v.a).det(a.sub(v.a)));        int d4 = dblcmp(v.b.sub(v.a).det(b.sub(v.a)));        if ((d1 ^ d2) == -2 && (d3 ^ d4) == -2)return 2;        return (d1 == 0 && dblcmp(v.a.sub(a).dot(v.a.sub(b))) <= 0||                d2 == 0 && dblcmp(v.b.sub(a).dot(v.b.sub(b))) <= 0||                d3 == 0 && dblcmp(a.sub(v.a).dot(a.sub(v.b))) <= 0||                d4 == 0 && dblcmp(b.sub(v.a).dot(b.sub(v.b))) <= 0);    }    point crosspoint(line v)    {        double a1 = v.b.sub(v.a).det(a.sub(v.a));        double a2 = v.b.sub(v.a).det(b.sub(v.a));        return point((a.x * a2 - b.x * a1) / (a2 - a1), (a.y * a2 - b.y * a1) / (a2 - a1));    }}a, b;void gao(){    point x = a.crosspoint(b);    a.b = x;    b.b = x;    if(dblcmp(point(a.a.sub(a.b)).det(b.a.sub(b.b))) < 0) swap(a, b);    if(dblcmp(a.a.y - b.a.y) > 0 && dblcmp(a.a.x - b.a.x) <= 0)    {        printf("0.00\n");        return;    }    if(dblcmp(a.a.y - b.a.y) < 0 && dblcmp(a.a.x - b.a.x) <= 0)    {        printf("0.00\n");        return;    }    if(dblcmp(a.a.y - b.a.y) < 0)    {        line tmp = line(a.a, point(-INF, a.a.y));        point z = tmp.crosspoint(b);        b.a = z;    }    else if(dblcmp(a.a.y - b.a.y) > 0)    {        line tmp = line(b.a, point(INF, b.a.y));        point z = tmp.crosspoint(a);        a.a = z;    }    double ans = point(a.a.sub(a.b)).det(b.a.sub(b.b)) / 2.0;    printf("%.2f\n", fabs(ans));}int main(){    int T;    scanf("%d", &T);    while(T--)    {        a.input(); b.input();        if(dblcmp(a.a.y - a.b.y) < 0) swap(a.a, a.b);        if(dblcmp(b.a.y - b.b.y) < 0) swap(b.a, b.b);        if(dblcmp(a.a.sub(a.b).det(b.a.sub(b.b))) == 0) printf("0.00\n");        else if(dblcmp(a.a.y - a.b.y) == 0 || dblcmp(b.a.y - b.b.y) == 0) printf("0.00\n");        else if(a.segcrossseg(b) == 0) printf("0.00\n");        else gao();    }    return 0;}


热点排行