码迷,mamicode.com
首页 > 其他好文 > 详细

PAT T1011 Cut Rectangles

时间:2020-02-13 13:22:13      阅读:56      评论:0      收藏:0      [点我收藏+]

标签:while   class   mes   分类   int   多边形   scan   cut   str   

大模拟题,按要求建立多边形,先定位斜边的位置,再分类讨论~

#include<bits/stdc++.h>
using namespace std;
const int maxn=1014;
struct node {
    double x,y;
}Node[2][maxn];
double distance (node a,node b) {
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int isXiebian (node a,node b) {
    if (a.x!=b.x&&a.y!=b.y) return 1;
    return 0;
}
double angle (node a,node b) {
    return fabs(a.x-b.x)/fabs(a.y-b.y);
}
vector<double> edge[2];
int main () {
    int T;
    scanf ("%d",&T);
    int k1,k2;
    while (T--) {
        edge[0].clear();edge[1].clear();
        scanf ("%d",&k1);
        for (int i=0;i<k1;i++) scanf ("%lf %lf",&Node[0][i].x,&Node[0][i].y);
        scanf ("%d",&k2);
        for (int i=0;i<k2;i++) scanf ("%lf %lf",&Node[1][i].x,&Node[1][i].y);
        double xie1=0,xie2=0,cnt1=0,cnt2=0,angle1,angle2,p1,p2;
        for (int i=0;i<k1;i++) {
            int j=i<k1-1?i+1:0;
            if (isXiebian(Node[0][i],Node[0][j])) xie1=distance(Node[0][i],Node[0][j]),cnt1++,
            angle1=angle(Node[0][i],Node[0][j]);
            edge[0].push_back(distance(Node[0][i],Node[0][j]));
        }
        for (int i=0;i<k2;i++) {
            int j=i<k2-1?i+1:0;
            if (isXiebian(Node[1][i],Node[1][j])) xie2=distance(Node[1][i],Node[1][j]),cnt2++,
            angle2=angle(Node[1][i],Node[1][j]);
            edge[1].push_back(distance(Node[1][i],Node[1][j]));
        }
        if (k1+k2>8||k1+k2<6) printf ("NO\n");
        else if (xie1==xie2&&cnt1==1&&cnt2==1) {
            if ((angle1==angle2||angle1*angle2==1)&&(k1!=4||k2!=4)) printf ("YES\n");
            else if (k1==4&&k2==4) {
                double z1=p1<k1-2?p1+2:p1+2-k1;
                double z2=p2<k2-2?p2+2:p2+2-k2;
                double z3=p1<k1-1?p1+1:0;
                double z4=p1>0?p1-1:k1-1;
                double z5=p2<k2-1?p2+1:0;
                double z6=p2>0?p2-1:k2-1;
                if (edge[0][z1]==edge[0][z2]&&(edge[0][z3]+edge[1][z5]==edge[0][z4]+edge[1][z6]||
                edge[0][z3]+edge[1][z6]==edge[0][z4]+edge[1][z5])) printf ("YES\n");
                else printf ("NO\n"); 
            }
            else printf ("NO\n");
        }
        else if (xie1==0&&xie2==0&&k1==4&&k2==4) {
            for (int i=0;i<k1;i++) {
                for (int k=0;k<k2;k++) 
                if (edge[0][i]==edge[1][k]) cnt1++;
            }
            if (cnt1==8||cnt1==16) printf ("YES\n");
            else printf ("NO\n");
        } 
        else printf ("NO\n");
    } 
    return 0;
} 

 

PAT T1011 Cut Rectangles

标签:while   class   mes   分类   int   多边形   scan   cut   str   

原文地址:https://www.cnblogs.com/zhanglichen/p/12302868.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!