加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

有史以来写的最长的代码。。。。1.5WB 啊!!

(2011-11-06 15:49:34)
标签:

杂谈

分类: ACM
RunID User Problem Result Memory Time Language Length Submit Time
269534 Creek A Wrong Answer

G++ 15015 B 2011-11-06 15:47:41

600多行代码啊!!!居然就连自己写的样例都过不了!!!
<code>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<math.h>
#include<string>
#include<algorithm>
using namespace std;
const double eps = 1e-5;

struct point {
    double x, y;
} pnt[5];

struct line {
    point a, b;
};

struct triang {
    point a, b, c;
    double edge[4];
} tr[4];
//quadrangel

struct quadrang {
    point a, b, c, d;
    double edge[5];
} ra;
//get distance

double dist(point a, point b) {
    return ((a.x - b.x)*(a.x - b.x)+(a.y - b.y)*(a.y - b.y));
}
//get triang's edge

triang getBt(triang k) {
    k.edge[0] = dist(k.a, k.b);
    k.edge[1] = dist(k.b, k.c);
    k.edge[2] = dist(k.c, k.a);
    return k;
}

triang getBt2(triang k) {
    k.edge[2] = dist(k.a, k.b);
    k.edge[1] = dist(k.b, k.c);
    k.edge[0] = dist(k.c, k.a);
    return k;
}

triang getBt3(triang k) {
    k.edge[2] = dist(k.a, k.b);
    k.edge[0] = dist(k.b, k.c);
    k.edge[1] = dist(k.c, k.a);
    return k;
}

triang getBt4(triang k) {
    k.edge[1] = dist(k.a, k.b);
    k.edge[0] = dist(k.b, k.c);
    k.edge[2] = dist(k.c, k.a);
    return k;
}

triang getBt5(triang k) {
    k.edge[0] = dist(k.a, k.b);
    k.edge[2] = dist(k.b, k.c);
    k.edge[1] = dist(k.c, k.a);
    return k;
}

void getBq() {
    ra.edge[0] = dist(ra.a, ra.b);
    ra.edge[1] = dist(ra.b, ra.c);
    ra.edge[2] = dist(ra.c, ra.d);
    ra.edge[3] = dist(ra.d, ra.a);
}
//凸包 begin here

double mult(point p1, point p2, point p0) {
    return (p1.x - p0.x)*(p2.y - p0.y)-(p2.x - p0.x)*(p1.y - p0.y);
}

bool operator<(const point &l, const point &r) {
    return l.y - r.y || (l.y == r.y && l.x < r.x);
}

int graham(point pnt[], int n) {
    int i, len, k = 0, top = 1;
    point res[5];
    sort(pnt, pnt + n);
    if (n == 0) return 0;
    res[0] = pnt[0];
    if (n == 1) return 1;
    res[1] = pnt[1];
    if (n == 2) return 2;
    res[2] = pnt[2];
    for (i = 2; i < n; i++) {
        while (top && mult(pnt[i], res[top], res[top - 1]))
            top--;
        res[++top] = pnt[i];
    }
    len = top;
    res[++top] = pnt[n - 2];
    for (i = n - 3; i >= 0; i--) {
        while (top != len && mult(pnt[i], res[top], res[top - 1]))
            top--;
        res[++top] = pnt[i];
    }
    return top;
}
//凸包 end here
//judge triangle is same?true:false;

//first Judge begin here

bool IsTraSame(triang a, triang b) {
    if (fabs(a.edge[0] - b.edge[0]) < eps && fabs(a.edge[1] - b.edge[1]) < eps && fabs(a.edge[2] - b.edge[2]) < eps) {
        return true;
    }
    if (fabs(a.edge[0] - b.edge[0]) < eps && fabs(a.edge[1] - b.edge[2]) < eps && fabs(a.edge[2] - b.edge[1]) < eps) {
        return true;
    }
    if (fabs(a.edge[0] - b.edge[1]) < eps && fabs(a.edge[1] - b.edge[0]) < eps && fabs(a.edge[2] - b.edge[2]) < eps) {
        return true;
    }
    if (fabs(a.edge[0] - b.edge[1]) < eps && fabs(a.edge[1] - b.edge[2]) < eps && fabs(a.edge[2] - b.edge[0]) < eps) {
        return true;
    }
    if (fabs(a.edge[0] - b.edge[2]) < eps && fabs(a.edge[1] - b.edge[0]) < eps && fabs(a.edge[2] - b.edge[1]) < eps) {
        return true;
    }
    if (fabs(a.edge[0] - b.edge[2]) < eps && fabs(a.edge[1] - b.edge[1]) < eps && fabs(a.edge[2] - b.edge[0]) < eps) {
        return true;
    }
    return false;
}

bool JudgeGram() {
    triang a, b;
    a.a = ra.a;
    a.b = ra.b;
    a.c = ra.c;
    b.a = ra.a;
    b.b = ra.d;
    b.c = ra.c;
    a = getBt(a);
    b = getBt(b);
    if (IsTraSame(a, tr[0]) && IsTraSame(b, tr[1])) {
        return true;
    }
    if (IsTraSame(a, tr[1]) && IsTraSame(b, tr[0])) {
        return true;
    }
    a.a = ra.b;
    a.b = ra.c;
    a.c = ra.d;
    b.a = ra.b;
    b.b = ra.a;
    b.c = ra.d;
    a = getBt(a);
    b = getBt(b);
    if (IsTraSame(a, tr[0]) && IsTraSame(b, tr[1])) {
        return true;
    }
    if (IsTraSame(a, tr[1]) && IsTraSame(b, tr[0])) {
        return true;
    }
    return false;
}
//first Judge end here

void format(line ln, double& A, double& B, double& C) {
    A = ln.a.y;
    B = -ln.a.x;
    C = ln.b.y * ln.a.x - ln.b.x * ln.a.y;
}

bool Solve2() {
    point e;
    triang a, b;
    double a1, b1, c1, a2, b2, c2;
    line ln1, ln2;
    //B点
    ln1.a = ra.a;
    ln1.b = ra.b;
    ln2.a = ra.c;
    ln2.b = ra.d;
    format(ln1, a1, b1, c1);
    format(ln2, a2, b2, c2);
    e.y = (-c1 + (c2 - c1) / (a2 - a1) * a1) / ((b2 - b1) * a1 / (a1 - a2) - b1);
    e.x = (-b1 * e.y - c1) / a1;
    a.a = ra.a;
    a.b = e;
    a.c = ra.d;
    b.a = ra.b;
    b.b = e;
    b.c = ra.c;
    a = getBt(a);
    b = getBt(b);
    if (IsTraSame(a, tr[0]) && IsTraSame(b, tr[1])) {
        return true;
    }
    if (IsTraSame(a, tr[1]) && IsTraSame(b, tr[0])) {
        return true;
    }
    ln1.a = ra.c;
    ln1.b = ra.b;
    ln2.a = ra.d;
    ln2.b = ra.a;
    format(ln1, a1, b1, c1);
    format(ln2, a2, b2, c2);
    e.y = (-c1 + (c2 - c1) / (a2 - a1) * a1) / ((b2 - b1) * a1 / (a1 - a2) - b1);
    e.x = (-b1 * e.y - c1) / a1;
    a.a = ra.a;
    a.b = e;
    a.c = ra.d;
    b.a = ra.b;
    b.b = e;
    b.c = ra.c;
    a = getBt(a);
    b = getBt(b);
    if (IsTraSame(a, tr[0]) && IsTraSame(b, tr[1])) {
        return true;
    }
    if (IsTraSame(a, tr[1]) && IsTraSame(b, tr[0])) {
        return true;
    }
    //C点
    ln1.a = ra.a;
    ln1.b = ra.c;
    ln2.a = ra.b;
    ln2.b = ra.d;
    format(ln1, a1, b1, c1);
    format(ln2, a2, b2, c2);
    e.y = (-c1 + (c2 - c1) / (a2 - a1) * a1) / ((b2 - b1) * a1 / (a1 - a2) - b1);
    e.x = (-b1 * e.y - c1) / a1;
    a.a = ra.b;
    a.b = e;
    a.c = ra.a;
    b.a = ra.d;
    b.b = e;
    b.c = ra.c;
    a = getBt(a);
    b = getBt(b);
    if (IsTraSame(a, tr[0]) && IsTraSame(b, tr[1])) {
        return true;
    }
    if (IsTraSame(a, tr[1]) && IsTraSame(b, tr[0])) {
        return true;
    }
    ln1.a = ra.d;
    ln1.b = ra.c;
    ln2.a = ra.b;
    ln2.b = ra.a;
    format(ln1, a1, b1, c1);
    format(ln2, a2, b2, c2);
    e.y = (-c1 + (c2 - c1) / (a2 - a1) * a1) / ((b2 - b1) * a1 / (a1 - a2) - b1);
    e.x = (-b1 * e.y - c1) / a1;
    a.a = ra.d;
    a.b = e;
    a.c = ra.a;
    b.a = ra.b;
    b.b = e;
    b.c = ra.c;
    a = getBt(a);
    b = getBt(b);
    if (IsTraSame(a, tr[0]) && IsTraSame(b, tr[1])) {
        return true;
    }
    if (IsTraSame(a, tr[1]) && IsTraSame(b, tr[0])) {
        return true;
    }
    //D点
    ln1.a = ra.a;
    ln1.b = ra.d;
    ln2.a = ra.b;
    ln2.b = ra.c;
    format(ln1, a1, b1, c1);
    format(ln2, a2, b2, c2);
    e.y = (-c1 + (c2 - c1) / (a2 - a1) * a1) / ((b2 - b1) * a1 / (a1 - a2) - b1);
    e.x = (-b1 * e.y - c1) / a1;
    a.a = ra.a;
    a.b = e;
    a.c = ra.b;
    b.a = ra.d;
    b.b = e;
    b.c = ra.c;
    a = getBt(a);
    b = getBt(b);
    if (IsTraSame(a, tr[0]) && IsTraSame(b, tr[1])) {
        return true;
    }
    if (IsTraSame(a, tr[1]) && IsTraSame(b, tr[0])) {
        return true;
    }
    ln1.a = ra.d;
    ln1.b = ra.c;
    ln2.a = ra.b;
    ln2.b = ra.a;
    format(ln1, a1, b1, c1);
    format(ln2, a2, b2, c2);
    e.y = (-c1 + (c2 - c1) / (a2 - a1) * a1) / ((b2 - b1) * a1 / (a1 - a2) - b1);
    e.x = (-b1 * e.y - c1) / a1;
    a.a = ra.c;
    a.b = e;
    a.c = ra.b;
    b.a = ra.a;
    b.b = e;
    b.c = ra.d;
    a = getBt(a);
    b = getBt(b);
    if (IsTraSame(a, tr[0]) && IsTraSame(b, tr[1])) {
        return true;
    }
    if (IsTraSame(a, tr[1]) && IsTraSame(b, tr[0])) {
        return true;
    }
    //A点
    ln1.a = ra.a;
    ln1.b = ra.d;
    ln2.a = ra.b;
    ln2.b = ra.c;
    format(ln1, a1, b1, c1);
    format(ln2, a2, b2, c2);
    e.y = (-c1 + (c2 - c1) / (a2 - a1) * a1) / ((b2 - b1) * a1 / (a1 - a2) - b1);
    e.x = (-b1 * e.y - c1) / a1;
    a.a = ra.d;
    a.b = e;
    a.c = ra.c;
    b.a = ra.a;
    b.b = e;
    b.c = ra.b;
    a = getBt(a);
    b = getBt(b);
    if (IsTraSame(a, tr[0]) && IsTraSame(b, tr[1])) {
        return true;
    }
    if (IsTraSame(a, tr[1]) && IsTraSame(b, tr[0])) {
        return true;
    }
    ln1.a = ra.a;
    ln1.b = ra.b;
    ln2.a = ra.c;
    ln2.b = ra.d;
    format(ln1, a1, b1, c1);
    format(ln2, a2, b2, c2);
    e.y = (-c1 + (c2 - c1) / (a2 - a1) * a1) / ((b2 - b1) * a1 / (a1 - a2) - b1);
    e.x = (-b1 * e.y - c1) / a1;
    a.a = ra.d;
    a.b = e;
    a.c = ra.a;
    b.a = ra.b;
    b.b = e;
    b.c = ra.c;
    a = getBt(a);
    b = getBt(b);
    if (IsTraSame(a, tr[0]) && IsTraSame(b, tr[1])) {
        return true;
    }
    if (IsTraSame(a, tr[1]) && IsTraSame(b, tr[0])) {
        return true;
    }
    return false;
}

bool Solve3() {
    int i, j, k;
    triang a;
    double s;
    for (i = 0; i < 4; i++) {
        s = ra.edge[(i + 2) % 4] + ra.edge[(i + 3) % 4];
        for (j = 0; j < 3; j++) {
            if (fabs(ra.edge[i] - tr[0].edge[j]) < eps) {
                for (k = 0; k < 3; k++) {
                    if (fabs(tr[0].edge[(j + 1) % 3] - tr[1].edge[k]) < eps) {
                        if (fabs(ra.edge[(i + 1) % 4] - tr[1].edge[(k + 1) % 3]) < eps && fabs(tr[0].edge[(j + 2) % 3] + tr[1].edge[(k + 2) % 3] - s) < eps) {
                            return true;
                        }
                    }
                }
            }
        }
    }
    for (i = 0; i < 4; i++) {
        s = ra.edge[(i + 1) % 4] + ra.edge[(i + 2) % 4];
        for (j = 0; j < 3; j++) {
            if (fabs(ra.edge[i] - tr[0].edge[j]) < eps) {
                for (k = 0; k < 3; k++) {
                    if (fabs(tr[0].edge[(j + 1) % 3] - tr[1].edge[k]) < eps) {
                        if (fabs(ra.edge[(i + 3) % 4] - tr[1].edge[(k + 1) % 3]) < eps && fabs(tr[0].edge[(j + 2) % 3] + tr[1].edge[(k + 2) % 3] - s) < eps) {
                            return true;
                        }
                    }
                }
            }
        }
    }
    return false;
}

int main() {
    int i, j, cas, casno = 0;
    scanf("%d", &cas);
    while (cas--) {
        scanf("%lf%lf%lf%lf%lf%lf", &tr[0].a.x, &tr[0].a.y, &tr[0].b.x, &tr[0].b.y, &tr[0].c.x, &tr[0].c.y);
        scanf("%lf%lf%lf%lf%lf%lf", &tr[1].a.x, &tr[1].a.y, &tr[1].b.x, &tr[1].b.y, &tr[1].c.x, &tr[1].c.y);
        scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &ra.a.x, &ra.a.y, &ra.b.x, &ra.b.y, &ra.c.x, &ra.c.y, &ra.d.x, &ra.d.y);
        tr[0] = getBt(tr[0]);
        tr[1] = getBt(tr[1]);
        getBq();
        pnt[0] = ra.a;
        pnt[1] = ra.b;
        pnt[2] = ra.c;
        pnt[3] = ra.d;
        int num = graham(pnt, 4);
        bool flag = false;
        printf("Case #%d: ", ++casno);
        if (num == 4) {
            flag = JudgeGram();
            if (flag) {
                puts("Yes");
            } else {
                puts("No");
            }
            continue;
        }
        flag = Solve2();
        if (flag) {
            puts("Yes");
            continue;
        }
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt2(tr[0]);
        tr[1] = getBt2(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt3(tr[0]);
        tr[1] = getBt3(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt4(tr[0]);
        tr[1] = getBt4(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt5(tr[0]);
        tr[1] = getBt5(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt(tr[0]);
        tr[1] = getBt2(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt(tr[0]);
        tr[1] = getBt3(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt(tr[0]);
        tr[1] = getBt4(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt(tr[0]);
        tr[1] = getBt5(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt2(tr[0]);
        tr[1] = getBt(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt2(tr[0]);
        tr[1] = getBt(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt2(tr[0]);
        tr[1] = getBt3(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt2(tr[0]);
        tr[1] = getBt4(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt2(tr[0]);
        tr[1] = getBt5(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt3(tr[0]);
        tr[1] = getBt(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt3(tr[0]);
        tr[1] = getBt2(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt3(tr[0]);
        tr[1] = getBt4(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt3(tr[0]);
        tr[1] = getBt5(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt4(tr[0]);
        tr[1] = getBt(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt4(tr[0]);
        tr[1] = getBt2(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt4(tr[0]);
        tr[1] = getBt3(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt4(tr[0]);
        tr[1] = getBt5(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt5(tr[0]);
        tr[1] = getBt(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt5(tr[0]);
        tr[1] = getBt2(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt5(tr[0]);
        tr[1] = getBt3(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        tr[0] = getBt5(tr[0]);
        tr[1] = getBt4(tr[1]);
        flag = Solve3();
        if (flag) {
            puts("Yes");
            continue;
        }
        puts("No");
    }
    return 0;
}

</code>

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有