题目分析:

对于给出的两个多边形是否可以组成一个矩形,这里我们分以下几种情况讨论

1.首先对于给出的两个多边形只有3-3,3-4,3-5,4-4才有可能组成一个矩形,并且两个多边形只可能是旋转90,180,270,360度得到的,所以如果能满足两个多边形是由一个矩形切成的,则这两个多边形最多有一条斜边,其余边都和坐标轴平行

2.经过第一轮筛选之后,我们继续分析,对于3-3和3-5的情况,我们只要判断两个多边形的斜边与坐标轴构成的三角形是否全等就能判断是否是一个矩形切得,而对于3-4则有一些不同,其中的四边形可能是梯形也可能是矩形,如果是矩形则三角+矩形不可能是一个矩形,如果是梯形则判断两条斜边与坐标轴构成的直角三角形是否全等即可

对于最后一种4-4的情况的讨论分为三种:1.都有一条斜边,此时情况有点特殊,因为即使有一条斜边,有可能是两个直角梯形构成的但不是矩形的情况,所以需要额外讨论这两个直角梯形的直角腰是否相等并且两条斜边构成的直角三角形是否全等;2.都没有斜边,此时判断两个矩形是否有一条边相等即可;3.如果一个四边形有斜边一个没有则显然不能构成矩形,结束

代码:

 1 #include<iostream>
2 #include<algorithm>
3 #include<stdio.h>
4 #include<string.h>
5 #include<cmath>
6 #include<vector>
7 using namespace std;
8
9 vector<int> a, b, c, d;
10 int n, m, m1;
11
12 int judge(){
13 if(m == 3 && m1 == 3 || m == 3 && m1 == 4 || m == 3 && m1 == 5 || m == 4 && m1 == 4) return 1;
14 return 0;
15 }
16
17 int judge1(int x){
18 if(x == 1){
19 int flag = -1; int app = 0;
20 for(int i = 0; i < m; i++){
21 if(a[i] != a[(i+1)%m] && b[i] != b[(i+1)%m]){
22 if(flag == -1){
23 app = 1; flag = i; //以下都以i 和i+1
24 }
25 else return -1;
26 }
27 }
28 if(app == 0) return 15; return flag;
29 }else{
30 int flag = -1; int app = 0;
31 for(int i = 0; i < m1; i++){
32 if(c[i] != c[(i+1)%m1] && d[i] != d[(i+1)%m1]){
33 if(flag == -1){
34 app = 1; flag = i; //以下都以i 和i+1
35 }
36 else return -1;
37 }
38 }
39 if(app == 0) return 15; return flag;
40 }
41 }
42
43 int main(){
44 scanf("%d", &n);
45 for(int i = 1; i <= n; i++){
46 scanf("%d", &m);
47 a.clear(); b.clear(); c.clear(); d.clear();
48 for(int j = 1; j <= m; j++){
49 int x, y; scanf("%d%d", &x, &y);
50 a.push_back(x); b.push_back(y);
51 }
52 scanf("%d", &m1);
53 for(int j = 1; j <= m1; j++){
54 int x, y; scanf("%d%d", &x, &y);
55 c.push_back(x); d.push_back(y);
56 }
57 if(m > m1){ //方便判断将边数少的的放在前面
58 swap(m, m1); swap(a, c); swap(b, d);
59 }
60 int f1 = judge(); int f2 = judge1(1); int f3 = judge1(2);
61 if(f1 == 1 && f2 >= 0 && f3 >= 0){ //先判断构成的两个多边形是否可能组成矩形 以及是否都只有一条斜边
62 if(m == 3 && m1 == 3 || m == 3 && m1 == 5){ //3-3 3-5的情况
63 int r1 = abs(a[f2] - a[(f2+1)%m]); int l1 = abs(b[f2] - b[(f2+1)%m]);
64 int r2 = abs(c[f3] - c[(f3+1)%m1]); int l2 = abs(d[f3] - d[(f3+1)%m1]);
65 if(r1 == r2 && l1 == l2 || r1 == l2 && l1 == r2) printf("YES\n");
66 else printf("NO\n");
67 }else if(m == 3 && m1 == 4){ //3-4
68 if(f3 == 15) printf("NO\n"); //如果四边形没有斜边
69 else{
70 int r1 = abs(a[f2] - a[(f2+1)%m]); int l1 = abs(b[f2] - b[(f2+1)%m]);
71 int r2 = abs(c[f3] - c[(f3+1)%m1]); int l2 = abs(d[f3] - d[(f3+1)%m1]);
72 if(r1 == r2 && l1 == l2 || r1 == l2 && l1 == r2) printf("YES\n");
73 else printf("NO\n");
74 }
75 }else{ //4-4
76 if(f2 == 15 && f3 == 15){ //都没有斜边
77 int r1 = (a[0] - a[1])*(a[0] - a[1]) + (b[0] - b[1])*(b[0] - b[1]); int l1 = (a[2] - a[1])*(a[2] - a[1]) + (b[2] - b[1])*(b[2] - b[1]);
78 int r2 = (c[0] - c[1])*(c[0] - c[1]) + (d[0] - d[1])*(d[0] - d[1]); int l2 = (c[2] - c[1])*(c[2] - c[1]) + (d[2] - d[1])*(d[2] - d[1]);
79 if(r1 == l2 || r1 == r2 || l1 == r2 || l1 == l2) printf("YES\n");
80 else printf("NO\n"
81 );
82 }else if(f2 != 15 && f3 != 15){ //都有斜边
83 int r1 = abs(a[f2] - a[(f2+1)%m]); int l1 = abs(b[f2] - b[(f2+1)%m]);
84 int r2 = abs(c[f3] - c[(f3+1)%m1]); int l2 = abs(d[f3] - d[(f3+1)%m1]);
85 if(r1 == r2 && l1 == l2 || r1 == l2 && l1 == r2){
86 int r1 = abs(a[(f2+2)%m] - a[(f2+3)%m]); int l1 = abs(b[(f2+2)%m] - b[(f2+3)%m]);
87 int r2 = abs(c[(f2+2)%m] - c[(f3+3)%m1]); int l2 = abs(d[(f2+2)%m] - d[(f3+3)%m1]);
88 if(r1 == r2 && l1 == l2 || r1 == l2 && l1 == r2) printf("YES\n");
89 else printf("NO\n");
90 }
91 else printf("NO\n");
92 }else{
93 printf("NO\n");
94 }
95 }
96 }else printf("NO\n");
97 }
98 return 0;
99 }

天梯赛练习 L3-006 迎风一刀斩 (30分) 几何关系的更多相关文章

  1. 天梯赛练习 L3-008 喊山 (30分) bfs搜索

    题目分析: 本题是一题比较简单的bfs搜索题,首先由于数据给的比较多不能直接开二维数组存放,而是用了vector的动态的二维数组的形式存放,对于每个出发点,我们bfs向四周搜索,标记搜索过的点,遇到搜 ...

  2. PAT天梯赛练习 L3-004 肿瘤诊断 (30分) 三维BFS

    题目分析: 可能是我的理解能力比较差,在读题的时候一直以为所有的切片是可以排列组合的,并不是按照输入顺序就定死的,那么这题就变得十分的复杂啦~~~~~,查看的题解之后发现所有的切片并没有所谓的自由组合 ...

  3. 团体程序设计天梯赛L3-019 代码排版(23分)

    打算学完编译原理后再次实现它... 以下为比较“杂乱”的方法: 海量数据: https://pan.baidu.com/s/1Prd0ZqNLoCLLvXyJjCef3w 如果大家有发现这个程序的问题 ...

  4. 2018天梯赛、蓝桥杯、(CCPC省赛、邀请赛、ICPC邀请赛)校内选拔赛反思总结!

    才四月份,上半年的比赛就告一段落了.. 天梯赛混子,三十个人分最低,把队友拖到了国三,蓝桥杯省二滚粗,止步京城,旅游选拔赛成功选为替补二队,啊! 不过既然已经过去,我们说些乐观的一面,积累了大赛经验是 ...

  5. L1-049 天梯赛座位分配 (20 分)

    L1-049 天梯赛座位分配 (20 分)(Java解法) 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所 ...

  6. L1-049 天梯赛座位分配 (20 分)

    天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位 ...

  7. L3-007 天梯地图 (30 分) dijkstra

    本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至少存在一条可达路线. 输 ...

  8. L3-007 天梯地图(30 分)

    本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至少存在一条可达路线. 输 ...

  9. 第四届CCCC团体程序设计天梯赛 后记

    一不小心又翻车了,第二次痛失200分 1.开局7分钟A了L2-3,一看榜已经有七个大兄弟排在前面了,翻车 * 1 2.把L1-3 A了18分,留了两分准备抢顽强拼搏奖,最后五秒钟把题过了,万万没想到还 ...

随机推荐

  1. redis学习之——主从复制(replication)

    准备:拥有linux环境,并安装redis mater:主机,进行写操作 slave:从机,进行读操作 一.配置 继续前边的学习.我们是拷贝redis.conf,文件到了/root /redis 下. ...

  2. 使用Binlog日志恢复误删的MySQL数据

    解到: MySQL的binlog日志是什么?通常是用来干什么的? 模拟一次误删数据的操作,并且使用binlog日志恢复误删的数据. 写这篇文章的初衷,是有一次我真的险些把测试数据库的一张表给删除了,当 ...

  3. 【JAVA基础】static的定义

    public class STATIC { public static void main(String[] args) { // 创建两个不同的类 只要赋值一个 另外一个定义好的static属性 会 ...

  4. UWP 实现Tab导航首页

    先看效果: 这个是用Pivot来实现 1.自定义Pivot的样式,使用Blend工具生成模板,将HeaderTemplate的布局都隐藏 1 <Style x:Key="PivotSt ...

  5. Python利用zmail收取邮件

    收取邮件一般用pop和imap,这里使用国人大神开发的zmail来收取: 1 ''' 2 #利用zmail收取邮件 3 #只要几行代码 4 #安装库:pip3 install zmail 5 #国内大 ...

  6. MySQL:判断逗号分隔的字符串中是否包含某个字符串 && 如何在一个以逗号分隔的列表中的一个字段中连接MySQL中的多对多关系中的数据

    需求:      sql语句中,判断以逗号分隔的字符串中是否包含某个特定字符串,类似于判断一个数组中是否包含某一个元素, 例如:判断 'a,b,c,d,e,f,g' 中是否包含 'a',sql语句如何 ...

  7. 使用CDN后如何配置Apache使其记录访客真实IP

    今天想看看哪些地区的人访问过我的网站,于是打开Apache网站响应日志,把访客IP复制到百度,发现搜到的全部都是我是用的CDN的节点IP,真实的访客IP并没有被记录. 如图所示,上面的103.45.7 ...

  8. 自己总结的关于图论的一些算法实现(C语言实现,有较详细注释,800行左右)

    1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #define TRUE 1 5 # ...

  9. [永恒之黑]CVE-2020-0796(漏洞复现)

    实验环境: 靶机:windows10 1903 专业版 攻击机:kali 2020.3 VMware:vmware14 实验工具: Python 3.8.5   msfconsole 实验PROC: ...

  10. 转载--对batch normalization的理解

    转载的大神的: https://www.cnblogs.com/guoyaohua/p/8724433.html 上边这个应该是抄的下边这个原文,但是上边的有重点标记 https://blog.csd ...