题意:

给三个线段(每个线段的两个端点的坐标),问这三个线段能否组成字母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;
}

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

  1. CF13B Letter A

    CF13B Letter A 洛谷传送门 题目描述 Little Petya learns how to write. The teacher gave pupils the task to writ ...

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

    ●赘述题目 10*10的房间内,有竖着的一些墙(不超过18个).问从点(0,5)到(10,5)的最短路. 按照输入样例,输入的连续5个数,x,y1,y2,y3,y4,表示(x,0--y1),(x,y2 ...

  3. 2018.07.04 POJ 2398 Toy Storage(二分+简单计算几何)

    Toy Storage Time Limit: 1000MS Memory Limit: 65536K Description Mom and dad have a problem: their ch ...

  4. 2018.07.03 BZOJ 1007: [HNOI2008]水平可见直线(简单计算几何)

    1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MB Description 在xoy直角坐标平面上有n条直线L1,L2,-Ln, ...

  5. python - 实现文本分类[简单使用第三方库完成]

    第三方库 pandas sklearn 数据集 来自于达观杯 训练:train.txt 测试:test.txt 概述 TF-IDF 模型提取特征值建立逻辑回归模型 代码 # _*_ coding:ut ...

  6. HDU2948Geometry Darts(简单计算几何)

    题目大意就是说两个人掷飞镖,飞镖在所给定的图形内就记一分,现在给定N个图形(圆.三角形和矩形),问每一次比赛(没人分别掷三次)谁赢. #include <map> #include < ...

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

    国际惯例的题面: 这题让我爆肝啦......这种计数显然容斥,正好不含任何坏点的我们不会算,但是我们能算至少含零个坏点的,至少含一个坏点的,至少含两个坏点的......所以最终的答案就是(至少含零个坏 ...

  8. 2018.07.04 POJ 1654 Area(简单计算几何)

    Area Time Limit: 1000MS Memory Limit: 10000K Description You are going to compute the area of a spec ...

  9. 2018.07.04 POJ 3304 Segments(简单计算几何)

    Segments Time Limit: 1000MS Memory Limit: 65536K Description Given n segments in the two dimensional ...

随机推荐

  1. 图论---DFS

    图论---DFS 1. 图的遍历 在理解DFS算法之前,我们首先需要对什么是遍历进行了解,遍历的概念就是:从某一个点出发(一般是首或尾),依次将数据结构中的每一个数据访问且只访问一遍. 2. DFS简 ...

  2. 【Python学习】1.数据类型

    一.整数 可以使用十进制和十六进制来表示整数.比如:-1000和0x1e3f2d 二.浮点数 直接表示浮点数,比如:2.443或者1.2e5 1.2e-10等 整数和浮点数在计算机内部存储的方式是不同 ...

  3. UI自动化测试:App的Webview页面元素左滑

      一.前言 在做App自动化测试时,我们会遇到如上图所示的列表数据页面左滑删除场景,一般可以通过location.rect方法获取对应列表的元素坐标,然后使用TouchAction或者swipe滑动 ...

  4. 限制只有VIP会员才能下载Ecshop文章页的附件

    以官方2.7.2默认模板为基础来讲述一下"如何在文章详情页限制只有VIP会员才能下载相关附件"这里假设VIP会员的等级ID为2首先修改 article.php 文件打开 /arti ...

  5. Linux系列(18) - 常用压缩命令(1)

    常用压缩格式 .zip .gz .bz2 .zip格式压缩/解压缩 命令格式 压缩 zip [压缩文件名] [源文件]:压缩文件 zip -r [压缩文件名] [源目录]:压缩目录 解压缩 unzip ...

  6. WireShark新手使用教程

    Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息.常用于开发测试过程各种问题定位.本文主要内容包括: 1.Wireshark软件下载和安装以及Wiresha ...

  7. Jenkins无法登陆解决方案

    Jenkins-2.204.1 版本 创建jenkins用户时,没填full name,且选择了使用系统的admin登录或者是admin登录只是改了admin的登录密码导致登录不上去(Invalid ...

  8. django 高级扩展-中间件-上传图片-分页-富文本-celery

    """ django 高级扩展 一.静态文件 1.css,js,json,图片,字体等 2.配置setting,在最底下设置静态文件目录,写入下面代码 #配置静态文件目录 ...

  9. abp 以或的方式验证多个 AuthorizeAttribute

    前言 在使用 abp 开发业务功能时,会遇到公用同一个类的情况,在给这个类配置权限时,就要添加多个 AuthorizeAttribute,类似下面这样: [Authorize(DcsPermissio ...

  10. 提问式复习:图文回顾 redo log 相关知识

    原文链接:提问式复习:图文回顾 redo log 相关知识 1.如何提升 redo日志 的写性能? 为了保证 redo日志 不丢失,会在磁盘中开辟一块空间将日志保存起来.但是这样会有一个问题,磁盘的读 ...