题目分析:

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

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. Vue--子组件互相传值,子组件来回传值,传值反复横跳

    Vue--子组件传值,子组件来回传值,子组件传值反复横跳 我不不仅要子组件之间直接传值,我还要传过去再传回来,传回来再传过去,子组件直接反复横跳 解决问题 给组件传值,并不知道改值的校验结果 同一个组 ...

  2. Spring AOP的理解(通俗易懂)。

    转载 原文链接:http://www.verydemo.com/demo_c143_i20837.html 这种在运行时,动态地将代码切入到类的指定方法.指定位置上的编程思想就是面向切面的编程. 1. ...

  3. 如何使用交易开拓者(TB)开发数字货币策略

    更多精彩内容,欢迎关注公众号:数量技术宅.想要获取本期分享的完整策略代码,请加技术宅微信:sljsz01 为何使用交易开拓者(TB)作为回测工具 交易开拓者(后文以TB简称)是一个支持国内期货市场K线 ...

  4. Linux修改系统时间为东八区北京时间(上海时间)

    1. Linux时间   Linux的时间分为 System Clock(系统时间)和 Real Time Clock(硬件时间,简称RTC).   系统时间:指系统内核中的时间.   硬件时间:指主 ...

  5. 【Cesium 颜狗初步】fabric 材质定义与自定义着色器实践

    fabric 材质定义:着色器实践 1. 示例代码 贴到沙盒里就可以运行: var viewer = new Cesium.Viewer("cesiumContainer"); v ...

  6. Linux下安装mysql-5.7.24

    Mysql数据库的安装对于开发者来说,是我们必然会面对的问题,它的安装过程其实并不复杂,并且网络上的安装教程也非常多,但是对于新手来说,各种不同形式的安装教程,又给新手们带来了要选择哪种方式进行安装的 ...

  7. Java进阶专题(十九) 消息中间件架构体系(1)-- ActiveMQ研究

    前言 MQ全称为Message Queue,即消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开 发中应用非常广泛.开发中消息队列通常有如下应用场景:1.任务异步处理.将不需要同步处理的 ...

  8. Ch2信息的表示和处理——caspp深入理解计算机系统

    目录 第2章 信息的表示和处理 2.1 信息存储 2.1.1 十六进制 一.表示法 二.加减 三.进制转换 2.1.2 字 2.1.3 数据大小 2.1.4 字节顺序与表示 一.字节的排列规则 二.打 ...

  9. 免杀shellcode并绕过杀毒添加自启动

    https://www.wtfsec.org/posts/%E5%85%8D%E6%9D%80shellcode%E5%B9%B6%E7%BB%95%E8%BF%87%E6%9D%80%E6%AF%9 ...

  10. Linux系列之makefile的简单入门

    什么是makefile呢? 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译, ...