zoukankan      html  css  js  c++  java
  • EOJ 3265 七巧板

    模拟。

    先判断三边形和四边形的个数。

    然后判断$5$个三角形是否都是等腰直角三角形。

    然后判断$5$个等腰直角三角形比例是否符合要求。

    然后寻找正方形。判断比例是否符合要求。

    最后判断四边形是否符合要求。

    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    struct X
    {
        int n;
        double x[5],y[5];
        double len[5];
    }s[10];
    
    double eps = 1e-4;
    
    bool cmp(X a, X b)
    {
        return a.n<b.n;
    }
    
    bool cmp1(X a, X b)
    {
        return a.len[3]<b.len[3];
    }
    
    double dis(double p1x,double p1y,double p2x,double p2y)
    {
        return sqrt((p1x-p2x)*(p1x-p2x)+(p1y-p2y)*(p1y-p2y));
    }
    
    int main()
    {
        for(int i=1;i<=7;i++)
        {
            scanf("%d",&s[i].n);
            for(int j=1;j<=s[i].n;j++) scanf("%lf%lf",&s[i].x[j],&s[i].y[j]);
        }
        sort(s+1,s+1+7,cmp);
    
        int sum3 = 0, sum4 = 0;
    
        for(int i=1;i<=7;i++)
        {
            if(s[i].n == 3) sum3++;
            if(s[i].n == 4) sum4++;
        }
    
        if(sum3 != 5)
        {
            printf("NO
    ");
            return 0;
        }
    
        if(sum4 != 2)
        {
            printf("NO
    ");
            return 0;
        }
    
        for(int i=1;i<=7;i++)
        {
            for(int j=1;j<=s[i].n;j++)
            {
                int L = j;
                int R = j+1;
                if(R == s[i].n + 1) R = 1;
                s[i].len[j] = dis(s[i].x[L],s[i].y[L],s[i].x[R],s[i].y[R]);
            }
        }
    
        for(int i=1;i<=7;i++) sort(s[i].len+1,s[i].len+1+s[i].n);
            
        //判断三角形是否均为等腰直角
        for(int i=1;i<=5;i++)
        {
            if(abs(s[i].len[1]-s[i].len[2])>eps) 
            {
                printf("NO
    ");
                return 0;
            }
            if(abs(s[i].len[3] - sqrt(2.0) * s[i].len[2])>eps)
            {
                printf("NO
    ");
                return 0;
            }
        }
    
        //判断5个三角形比例是否符合要求
        sort(s+1,s+1+5,cmp1);
        if(abs(s[1].len[3]-s[2].len[3])>eps)
        {
            printf("NO
    ");
            return 0;
        }
        if(abs(s[2].len[3] * sqrt(2.0) - s[3].len[3])>eps)
        {
            printf("NO
    ");
            return 0;
        }
        if(abs(s[3].len[3] * sqrt(2.0) - s[4].len[3])>eps)
        {
            printf("NO
    ");
            return 0;
        }
        if(abs(s[5].len[3] - s[4].len[3])>eps)
        {
            printf("NO
    ");
            return 0;
        }
    
        //寻找哪个可能是正方形
        int f=0,g;
        for(int i=6;i<=7;i++)
            if(abs(s[i].len[4] - s[i].len[1])<eps) f=i;
    
        if(f==0)
        {
            printf("NO
    ");
            return 0;
        }
        else if(f == 6) g = 7;
        else g = 6;
         
        //判断正方形
        double Len = dis(s[f].x[1],s[f].y[1],s[f].x[3],s[f].y[3]);
        if(abs(s[f].len[1] * sqrt(2.0) - Len)>eps)
        {
            printf("NO
    ");
            return 0;
        }
    
        if(abs(s[1].len[1] - s[f].len[1])>eps)
        {
            printf("NO
    ");
            return 0;
        }
    
        //判断四边形
        if(abs(s[g].len[1] - s[g].len[2])>eps)
        {
            printf("NO
    ");
            return 0;
        }
        if(abs(s[g].len[3] - s[g].len[4])>eps)
        {
            printf("NO
    ");
            return 0;
        }
        if(abs(s[g].len[2] * sqrt(2.0) - s[g].len[3])>eps)
        {
            printf("NO
    ");
            return 0;
        }
    
        double pp,qq;
        pp = dis(s[g].x[1],s[g].y[1],s[g].x[3],s[g].y[3]);
        qq = dis(s[g].x[2],s[g].y[2],s[g].x[4],s[g].y[4]);
        Len = min(pp,qq);
    
        if(abs(Len - s[f].len[1])>eps)
        {
            printf("NO
    ");
            return 0;
        }
    
        printf("YES
    ");
    
        return 0;
    }
  • 相关阅读:
    软工试水日报-纯js原生简易动态表格 3/15
    软工试水日报-Echarts动态柱形图 3/14
    大二下学期第一次结对作业(第一阶段)
    大二下学期之第一次结对作业(第一阶段)
    大二下每周总结
    大二下学期之第一次结对作业(第一阶段)
    大二下学期第一次结对作业(第一阶段)
    大二下学期第一次结对作业(第一阶段)
    大二下学期每日总结之第一次个人作业(第三阶段)
    大二下学期每日总结之第一次个人作业(第三阶段)
  • 原文地址:https://www.cnblogs.com/zufezzt/p/6852867.html
Copyright © 2011-2022 走看看