CF13B Letter A

洛谷传送门

题目描述

Little Petya learns how to write. The teacher gave pupils the task to write the letter AA on the sheet of paper. It is required to check whether Petya really had written the letter AA .

You are given three segments on the plane. They form the letter AA if the following conditions hold:

  • Two segments have common endpoint (lets call these segments first and second), while the third segment connects two points on the different segments.
  • The angle between the first and the second segments is greater than 00 and do not exceed 9090 degrees.
  • The third segment divides each of the first two segments in proportion not less than 1/41/4 (i.e. the ratio of the length of the shortest part to the length of the longest part is not less than 1/41/4 ).

输入格式

The first line contains one integer tt ( 1<=t<=100001<=t<=10000 ) — the number of test cases to solve. Each case consists of three lines. Each of these three lines contains four space-separated integers — coordinates of the endpoints of one of the segments. All coordinates do not exceed 10^{8}108 by absolute value. All segments have positive length.

输出格式

Output one line for each test case. Print «YES» (without quotes), if the segments form the letter AA and «NO» otherwise.

题意翻译

给定三条线段,请你判断这三条线段能否组成字母'A' 判定条件 1.其中的两条线段有共同的端点(我们暂且称它们为第一条,第二条线段),第三条线段的端点分别在这两条不同的线段上。 2.第一条和第二条线段的夹角必须大于0度小于等于90度。 3.第三条线段截得的另外两条线段的较小长度与较大长度的比值必须大于等于1/4。 输入:第一行一个整数t,下面3*t行每三行为一组数据,代表三条线段,每一行代表的是一条线段两个端点的坐标 输出:对于每一组数据,输出"YES"如果能组成'A',否则输出"NO" 感谢 @稀神探女 提供的翻译。

输入输出样例

输入 #1复制

输出 #1复制

题解:

本蒟蒻人生中的第一道黑题

一道复杂的模拟,其中掺杂了许些计算几何的风情。

其实涉及到的计算几何就是一点点的解析几何,判断三点共线,判断夹角小于90°,判断线段差分比例小于\(\frac{1}{4}\)。

求角小于90°的时候运用了叉积,需要平面向量的相关知识,不懂的同学请自行百度。

比较恶心的判断是差分比例小于\(\frac{1}{4}\)。让我来讲一下——

算了不讲了,看代码吧,模拟的思想还是比较简单的,相信大家能看明白。

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node
{
int x,y,j,k;
}a[10];
int t,x,y,m,n,p,q,x1,yy,x2,y2,c1,c2,flag;
int check_oneline(int a,int b,int c,int d,int e,int f)
{
if((ll)(f-b)*(c-a)==(ll)(d-b)*(e-a))
return 1;
return 0;
}
int check_angle(int x,int y,int a,int b,int p,int q)
{
if((ll)(a-x)*(p-x)+(ll)(b-y)*(q-y)<0)
return 0;
return 1;
}
int check_subseg(int x,int y,int m,int n,int a,int b)
{
if(x!=a)
{
if(a>x)
{
if((a-x)*5<(m-x))
return 0;
if((a-x)*5>(m-x)*4)
return 0;
return 1;
}
else
{
if((x-a)*5<(x-m))
return 0;
if((x-a)*5>(x-m)*4)
return 0;
return 1;
}
}
else
{
if(b>y)
{
if((b-y)*5<(n-y))
return 0;
if((b-y)*5>(n-y)*4)
return 0;
return 1;
}
else
{
if((y-b)*5<(y-n))
return 0;
if((y-b)*5>(y-n)*4)
return 0;
return 1;
}
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
for(int i=1;i<=3;i++)
scanf("%d%d%d%d",&a[i].x,&a[i].y,&a[i].j,&a[i].k);
for(int i=1;i<=2;i++)
for(int j=i+1;j<=3;j++)
{
if(a[i].x==a[j].x&&a[i].y==a[j].y)
{
x=a[i].x,y=a[i].y;
m=a[i].j,n=a[i].k;
p=a[j].j,q=a[j].k;
c1=i,c2=j;
}
else if(a[i].x==a[j].j&&a[i].y==a[j].k)
{
x=a[i].x,y=a[i].y;
m=a[i].j,n=a[i].k;
p=a[j].x,q=a[j].y;
c1=i,c2=j;
}
else if(a[i].j==a[j].j&&a[i].k==a[j].k)
{
x=a[i].j,y=a[i].k;
m=a[i].x,n=a[i].y;
p=a[j].x,q=a[j].y;
c1=i,c2=j;
}
else if(a[i].j==a[j].x&&a[i].k==a[j].y)
{
x=a[i].j,y=a[i].k;
m=a[i].x,n=a[i].y;
p=a[j].j,q=a[j].k;
c1=i,c2=j;
}
}
for(int i=1;i<=3;i++)
if(i!=c1&&i!=c2)
{
x1=a[i].x,yy=a[i].y,x2=a[i].j,y2=a[i].k;
break;
}
flag=1;
if(check_angle(x,y,m,n,p,q)==0)
flag=0;
if(flag)
{
if(check_oneline(x,y,m,n,x1,yy)&&check_oneline(x,y,p,q,x2,y2))
{
if(check_subseg(x,y,m,n,x1,yy)==0)
flag=0;
if(check_subseg(x,y,p,q,x2,y2)==0)
flag=0;
}
else if(check_oneline(x,y,p,q,x1,yy)&&check_oneline(x,y,m,n,x2,y2))
{
if(check_subseg(x,y,m,n,x2,y2)==0)
flag=0;
if(check_subseg(x,y,p,q,x1,yy)==0)
flag=0;
}
else
flag=0;
}
printf(flag?"YES\n":"NO\n");
}
return 0;
}

最新文章

  1. PHP文件相关的操作函数——目录操作
  2. jquery .attr()
  3. 为什么我会选IT【这几年是怎么过来的】
  4. Android -----listView的属性大全
  5. Nginx-uri、request_uri、document_uri之间的区别
  6. MYSQL服务器字符集设置
  7. IE11之F12 Developer Tools--控制台工具(Console)
  8. 通过Messenger与后台连接(单向操作,activity向service发送数据)
  9. 51nod1120 机器人走方格 V3
  10. javascript中的关键字和保留字
  11. 【App FrameWork】页面之间的参数传递
  12. Spring3 + Spring MVC+ Mybatis 3+Mysql 项目整合(注解及源码)
  13. [PWA] 2. Service worker life cycle
  14. UVA - 11986 Save from Radiation
  15. C语言之形参和实参
  16. Java web轻量级开发面试教程读书笔记:数据库方面,如何准备面试
  17. Python中标准模块importlib详解
  18. Spring的事务
  19. 52.JQ---向上滚动显示,向下滚动隐藏
  20. nginx 服务器在上传文件出现413代码的解决方法

热门文章

  1. Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2) F. Bits And Pieces sosdp
  2. [LeetCode] 407. Trapping Rain Water II 收集雨水之二
  3. 「ZJOI2019」浙江省选
  4. Pandownload倒下了,还有它,又一款百度云下载神器,速度可达10M/s
  5. webpack与vue环境搭建(转载)
  6. 实现ElementUI Dialog宽度响应式变化
  7. DFS(三):八皇后问题
  8. python-3-条件判断练习题
  9. HTTPS 相关问题
  10. mysql批量更新数据(性能优化) 第一种方式