cf13B Letter A(分类+简单计算几何,,)

题意:

给三个线段(每个线段的两个端点的坐标),问这三个线段能否组成字母A。

组成字母A的条件:

1.两个线段有公共端点。

2.这两个线段夹角小于等于90度。

3.第三个线段的两个端点分别在这两个线段上,且各自分割的大小比率不超过4:1

思路:

直接。。。。。

应该开始积累计算几何的代码了,,,,

代码:

struct Point{
    double x,y;
};
struct segment{
    Point a,b;
}
S[5];

bool samePoint(Point a,Point b){
    if(fabs(a.x-b.x)<eps && fabs(a.y-b.y)<eps){
        return true;
    }
    return false;
}
bool PointOnSegment(Point a,segment L){
    if((a.x-L.a.x)*(L.b.y-L.a.y)==(a.y-L.a.y)*(L.b.x-L.a.x)
       && min(L.a.x,L.b.x)<=a.x && a.x<=max(L.a.x,L.b.x)
       && min(L.a.y,L.b.y)<=a.y && a.y<=max(L.a.y,L.b.y)){
            return true;
       }
       return false;
}
double rates(Point a,segment L){
    double l1=(a.x-L.a.x)*(a.x-L.a.x)+(a.y-L.a.y)*(a.y-L.a.y);
    double l2=(a.x-L.b.x)*(a.x-L.b.x)+(a.y-L.b.y)*(a.y-L.b.y);
    if(l1<eps || l2<eps){
        return 999999.0;
    }
    if(l1<l2){
        return l2/l1;
    }
    else{
        return l1/l2;
    }
}
ll Cos(double x1,double y1,double x2,double y2){
    if(x1*x2+y1*y2>=0){
        return true;
    }
    return false;
}
bool solve(){
    //1 and 2
    bool t1=samePoint(S[1].a,S[2].a);
    bool t2=samePoint(S[1].a,S[2].b);
    bool t3=samePoint(S[1].b,S[2].a);
    bool t4=samePoint(S[1].b,S[2].b);
    if(t1||t2||t3||t4){
        bool flag=false;
        if(t1){
            double x1,y1,x2,y2;
            x1=S[1].b.x-S[1].a.x;
            y1=S[1].b.y-S[1].a.y;
            x2=S[2].b.x-S[2].a.x;
            y2=S[2].b.y-S[2].a.y;
            if(Cos(x1,y1,x2,y2)){
                flag=true;
            }
        }
        if(t2){
            double x1,y1,x2,y2;
            x1=S[1].b.x-S[1].a.x;
            y1=S[1].b.y-S[1].a.y;
            x2=S[2].a.x-S[2].b.x;
            y2=S[2].a.y-S[2].b.y;
            if(Cos(x1,y1,x2,y2)){
                flag=true;
            }
        }
        if(t3){
            double x1,y1,x2,y2;
            x1=S[1].a.x-S[1].b.x;
            y1=S[1].a.y-S[1].b.y;
            x2=S[2].b.x-S[2].a.x;
            y2=S[2].b.y-S[2].a.y;
            if(Cos(x1,y1,x2,y2)){
                flag=true;
            }
        }
        if(t4){
            double x1,y1,x2,y2;
            x1=S[1].a.x-S[1].b.x;
            y1=S[1].a.y-S[1].b.y;
            x2=S[2].a.x-S[2].b.x;
            y2=S[2].a.y-S[2].b.y;
            if(Cos(x1,y1,x2,y2)){
                flag=true;
            }
        }
        if(flag){
            if(PointOnSegment(S[3].a,S[1]) && PointOnSegment(S[3].b,S[2])){
                if(rates(S[3].a,S[1])<=16.0 && rates(S[3].b,S[2])<=16.0){
                    return true;
                }
            }
            if(PointOnSegment(S[3].b,S[1]) && PointOnSegment(S[3].a,S[2])){
                if(rates(S[3].b,S[1])<=16.0 && rates(S[3].a,S[2])<=16.0){
                    return true;
                }
            }
        }
    }

    //1 and 3
     t1=samePoint(S[1].a,S[3].a);
     t2=samePoint(S[1].a,S[3].b);
     t3=samePoint(S[1].b,S[3].a);
     t4=samePoint(S[1].b,S[3].b);
    if(t1||t2||t3||t4){
        bool flag=false;
        if(t1){
            double x1,y1,x2,y2;
            x1=S[1].b.x-S[1].a.x;
            y1=S[1].b.y-S[1].a.y;
            x2=S[3].b.x-S[3].a.x;
            y2=S[3].b.y-S[3].a.y;
            if(Cos(x1,y1,x2,y2)){
                flag=true;
            }
        }
        if(t2){
            double x1,y1,x2,y2;
            x1=S[1].b.x-S[1].a.x;
            y1=S[1].b.y-S[1].a.y;
            x2=S[3].a.x-S[3].b.x;
            y2=S[3].a.y-S[3].b.y;
            if(Cos(x1,y1,x2,y2)){
                flag=true;
            }
        }
        if(t3){
            double x1,y1,x2,y2;
            x1=S[1].a.x-S[1].b.x;
            y1=S[1].a.y-S[1].b.y;
            x2=S[3].b.x-S[3].a.x;
            y2=S[3].b.y-S[3].a.y;
            if(Cos(x1,y1,x2,y2)){
                flag=true;
            }
        }
        if(t4){
            double x1,y1,x2,y2;
            x1=S[1].a.x-S[1].b.x;
            y1=S[1].a.y-S[1].b.y;
            x2=S[3].a.x-S[3].b.x;
            y2=S[3].a.y-S[3].b.y;
            if(Cos(x1,y1,x2,y2)){
                flag=true;
            }
        }
        if(flag){
            if(PointOnSegment(S[2].a,S[1]) && PointOnSegment(S[2].b,S[3])){
                if(rates(S[2].a,S[1])<=16.0 && rates(S[2].b,S[3])<=16.0){
                    return true;
                }
            }
            if(PointOnSegment(S[2].b,S[1]) && PointOnSegment(S[2].a,S[3])){
                if(rates(S[2].b,S[1])<=16.0 && rates(S[2].a,S[3])<=16.0){
                    return true;
                }
            }
        }
    }

    //2 and 3
    t1=samePoint(S[2].a,S[3].a);
     t2=samePoint(S[2].a,S[3].b);
     t3=samePoint(S[2].b,S[3].a);
     t4=samePoint(S[2].b,S[3].b);
    if(t1||t2||t3||t4){
        bool flag=false;
        if(t1){
            double x1,y1,x2,y2;
            x1=S[2].b.x-S[2].a.x;
            y1=S[2].b.y-S[2].a.y;
            x2=S[3].b.x-S[3].a.x;
            y2=S[3].b.y-S[3].a.y;
            if(Cos(x1,y1,x2,y2)){
                flag=true;
            }
        }
        if(t2){
            double x1,y1,x2,y2;
            x1=S[2].b.x-S[2].a.x;
            y1=S[2].b.y-S[2].a.y;
            x2=S[3].a.x-S[3].b.x;
            y2=S[3].a.y-S[3].b.y;
            if(Cos(x1,y1,x2,y2)){
                flag=true;
            }
        }
        if(t3){
            double x1,y1,x2,y2;
            x1=S[2].a.x-S[2].b.x;
            y1=S[2].a.y-S[2].b.y;
            x2=S[3].b.x-S[3].a.x;
            y2=S[3].b.y-S[3].a.y;
            if(Cos(x1,y1,x2,y2)){
                flag=true;
            }
        }
        if(t4){
            double x1,y1,x2,y2;
            x1=S[2].a.x-S[2].b.x;
            y1=S[2].a.y-S[2].b.y;
            x2=S[3].a.x-S[3].b.x;
            y2=S[3].a.y-S[3].b.y;
            if(Cos(x1,y1,x2,y2)){
                flag=true;
            }
        }
        if(flag){
            if(PointOnSegment(S[1].a,S[2]) && PointOnSegment(S[1].b,S[3])){
                if(rates(S[1].a,S[2])<=16.0 && rates(S[1].b,S[3])<=16.0){
                    return true;
                }
            }
            if(PointOnSegment(S[1].b,S[2]) && PointOnSegment(S[1].a,S[3])){
                if(rates(S[1].b,S[2])<=16.0 && rates(S[1].a,S[3])<=16.0){
                    return true;
                }
            }
        }
    }

    return false;
}

int T;
int main(){

    cin>>T;
    while(T--){
        scanf("%lf%lf%lf%lf",&S[1].a.x,&S[1].a.y,&S[1].b.x,&S[1].b.y);
        scanf("%lf%lf%lf%lf",&S[2].a.x,&S[2].a.y,&S[2].b.x,&S[2].b.y);
        scanf("%lf%lf%lf%lf",&S[3].a.x,&S[3].a.y,&S[3].b.x,&S[3].b.y);
        if(solve()){
            puts("YES");
        }else{
            puts("NO");
        }
    }

    return 0;
}
时间: 2024-08-10 01:30:37

cf13B Letter A(分类+简单计算几何,,)的相关文章

[HDU 4082] Hou Yi&#39;s secret (简单计算几何)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4082 题目大意: 给你n个点,问能最多构成多少个相似三角形. 用余弦定理,计算三个角度,然后暴力数有多少个,更新答案. 代码: 1 #include <cstdio> 2 #include <cmath> 3 #include <algorithm> 4 #include <cstring> 5 #include <vector> 6 #includ

POJ 1556 The Doors(简单计算几何+最短路)

●赘述题目 10*10的房间内,有竖着的一些墙(不超过18个).问从点(0,5)到(10,5)的最短路. 按照输入样例,输入的连续5个数,x,y1,y2,y3,y4,表示(x,0--y1),(x,y2--y3),(x,y4--10)是墙壁. ●题解 方法:建图(用到简单计算几何)+最短路 ○记录下每个端点. ○包含起点,终点,以及每个墙的可以走的端点,如下图: ○然后枚举点,尝试两两组合连(线段)边,若该线不会撞在墙上,即不会与墙壁线段相交,就add_adge(). 效果图如下: 如何判断呢?

机器学习-分类简单介绍

一 分类概述 分类在数据挖掘中是一项很重要的任务.分类的目的是学会一个分类函数或分类模型(也经常称作为分类器),该模型能把数据库中的数据项映射到给定类别中的某一个类别. 分类属于一种有指导的学习,模型的学习是在被告知每一个训练样本属于哪个类的"指导"下进行的.并随机的从样本群选取.每一个训练样本另一个特定的类标签与之相应,它不用于无指导的学习(聚类). 二 分类器 分类器的构造方法有统计方法.机器方法.神经网络方法等. 统计方法 包含贝叶斯和非參数法.常见的临近学习或基于事例的学习属于

HDU2948Geometry Darts(简单计算几何)

题目大意就是说两个人掷飞镖,飞镖在所给定的图形内就记一分,现在给定N个图形(圆.三角形和矩形),问每一次比赛(没人分别掷三次)谁赢. 1 #include <map> 2 #include <set> 3 #include <stack> 4 #include <queue> 5 #include <cmath> 6 #include <ctime> 7 #include <vector> 8 #include <c

Bzoj4558:分类讨论 计算几何 组合数学

国际惯例的题面: 这题让我爆肝啦......这种计数显然容斥,正好不含任何坏点的我们不会算,但是我们能算至少含零个坏点的,至少含一个坏点的,至少含两个坏点的......所以最终的答案就是(至少含零个坏点的-至少含一个坏点的+至少含两个坏点的-至少含三个坏点的+至少含四个坏点的).然后就是怎么计算的问题.对于至少含零个坏点的,我们不妨设定所有点都是好点.对于非正放的正方形,我们能找到一个正好包含它的最小的正放的正方形,显然这样的正方形是唯一的. 然后我们让四个点在这个正方形的边上滑动,显然这四个点

Gym 101917 E 简单计算几何,I 最大流

题目链接 https://codeforces.com/gym/101917 E 题意:给定一个多边形(n个点),然后逆时针旋转A度,然后对多边形进行规约,每个点的x规约到[0,w]范围内,y规约到[0,h]范围内,输出规约后的结果. 解析:求出来 多边形的长和宽,再和w,h比较,对点按比例进行缩放就好了. (多边形旋转其实是绕给出的第一个点旋转,以为是绕原点wa了1发). AC代码 1 #include <bits/stdc++.h> 2 #define Vector Point 3 usi

zoj3728_Collision(简单计算几何)

/////////////////////////////////////////////////////////////////////////////////////////////////////// 作者:tt2767 声明:本文遵循以下协议自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 查看本文更新与讨论请点击:http://blog.csdn.net/tt2767 链接被删请百度: CSDN tt2767 ///////////////

UVA - 10250 - The Other Two Trees (简单计算几何)

UVA - 10250 The Other Two Trees Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description Problem E The Other Two Trees Input: standard input Output: standard output Time Limit: 2 seconds You have a quadrilateral

HDU 4793 Collision (2013长沙现场赛,简单计算几何)

Collision Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 685    Accepted Submission(s): 248Special Judge Problem Description There's a round medal fixed on an ideal smooth table, Fancy is tryin