CF13B Letter A

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
":"NO
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/fusiwei/p/11614070.html