迎着一面矩形的大旗一刀斩下,如果你的刀够快的话,这笔直一刀可以切出两块多边形的残片。反过来说,如果有人拿着两块残片来吹牛,说这是自己迎风一刀斩落的,你能检查一下这是不是真的吗?

注意摆在你面前的两个多边形可不一定是端端正正摆好的,它们可能被平移、被旋转(逆时针90度、180度、或270度),或者被(镜像)翻面。

这里假设原始大旗的四边都与坐标轴是平行的。

输入格式:

输入第一行给出一个正整数N(≤20),随后给出N对多边形。每个多边形按下列格式给出:

kx1​y1​⋯xkyk

其中k(2<k≤10)是多边形顶点个数;(xi​,yi​)(0≤xi​,yi​≤108)是顶点坐标,按照顺时针或逆时针的顺序给出。

注意:题目保证没有多余顶点。即每个多边形的顶点都是不重复的,任意3个相邻顶点不共线。

输出格式:

对每一对多边形,输出YES或者NO

输入样例:

8
3 0 0 1 0 1 1
3 0 0 1 1 0 1
3 0 0 1 0 1 1
3 0 0 1 1 0 2
4 0 4 1 4 1 0 0 0
4 4 0 4 1 0 1 0 0
3 0 0 1 1 0 1
4 2 3 1 4 1 7 2 7
5 10 10 10 12 12 12 14 11 14 10
3 28 35 29 35 29 37
3 7 9 8 11 8 9
5 87 26 92 26 92 23 90 22 87 22
5 0 0 2 0 1 1 1 2 0 2
4 0 0 1 1 2 1 2 0
4 0 0 0 1 1 1 2 0
4 0 0 0 1 1 1 2 0

输出样例:

YES
NO
YES
YES
YES
YES
NO
YES

分析:要让两个图形能够拼接成矩形只有四种情况 1.两个直角三角形 2.两个矩形 3.一个三角形配一个五角形 4.两个直角梯形。由于题目特殊的旋转限制,直角边只会和x轴或y轴平行。非矩形情况首先判断是不是有 边数 – 1 的直角边,然后判断两个图形斜边是否相等。四边形则先判断是否是两个直角梯形,是的话高且斜边都相等则符合,如果是两个矩形 任意一边相等即可。k1表示第一个图形的斜率,k2表示第二个图形的斜率,SLength中储存较短的平行于x轴的边,LLength中储存较长的平行于x轴的边,SWidth中储存较短的平行于y轴的边,LWidth中储存较长的平行于y轴的边,res表示有多少条直角边,dif为两点距离~

#include <bits/stdc++.h>
using namespace std;
int n, k1, k2, SLength, LLength, SWidth, LWidth, res, dif, D1, D2, a, b;
vector<pair<int, int>> A(10), B(10);
void deal(const vector<pair<int, int>> &C, const int &l) {res = SLength = LLength = SWidth = LWidth = 0;for (int i = 0; i < l; i++) {if (C[i].first == C[(i + 1) % l].first) {res++;dif = abs(C[i].second - C[(i + 1) % l].second);if (dif > LLength) SLength = LLength, LLength = dif;else SLength = dif;} else if (C[i].second == C[(i + 1) % l].second) {res++;dif = abs(C[i].first - C[(i + 1) % l].first);if (dif > LWidth) SWidth = LWidth, LWidth = dif;else SWidth = dif;}}
}
string judge() {if (k1 > 5 || k2 > 5) return "NO";if (k1 == 4 && k2 == 4) {deal(A, k1);if (res == 4) {D1 = LLength, D2 = LWidth;deal(B, k2);if (res != 4) return "NO";if (D1 == LLength || D2 == LWidth || D2 == LLength || D1 == LWidth) return "YES";} else if (res == 3) {if (SWidth == 0) D1 = LWidth, D2 = LLength - SLength;else  D1 = LLength, D2 = LWidth - SWidth;deal(B, k2);if (res != 3) return "NO";if (SWidth == 0 && D1 == LWidth && D2 == LLength - SLength) return "YES";else if (SLength == 0 && D1 == LLength && D2 == LWidth - SWidth) return "YES";}return "NO";}if (k2 > k1) swap(k1, k2), swap(A, B);deal(A, k1);if (res != k1 - 1) return "NO";D1 = LLength - SLength, D2 = LWidth - SWidth;deal(B, k2);if (res != k2 - 1) return "NO";if ((D1 == LLength  && D2 == LWidth) || (D2 == LLength && D1 == LWidth)) return "YES";return "NO";
}
int main() {cin >> n;while (n--) {cin >> k1;for (int i = 0; i < k1; i++) cin >> A[i].first >> A[i].second;cin >> k2;for (int i = 0; i < k2; i++) cin >> B[i].first >> B[i].second;cout << judge() << '\n';}return 0;
}

L3-006 迎风一刀斩 (30 分)-PAT 团体程序设计天梯赛 GPLT相关推荐

  1. L3-011 直捣黄龙 (30 分)-PAT 团体程序设计天梯赛 GPLT

    本题是一部战争大片 -- 你需要从己方大本营出发,一路攻城略地杀到敌方大本营.首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营.当这样的路径不唯一时,要求选择可以沿途解放最多城镇 ...

  2. L3-017 森森快递 (30 分)-PAT 团体程序设计天梯赛 GPLT

    森森开了一家快递公司,叫森森快递.因为公司刚刚开张,所以业务路线很简单,可以认为是一条直线上的N个城市,这些城市从左到右依次从0到(N−1)编号.由于道路限制,第i号城市(i=0,⋯,N−2)与第(i ...

  3. L3-012 水果忍者 (30 分)-PAT 团体程序设计天梯赛 GPLT

    2010年风靡全球的"水果忍者"游戏,想必大家肯定都玩过吧?(没玩过也没关系啦~)在游戏当中,画面里会随机地弹射出一系列的水果与炸弹,玩家尽可能砍掉所有的水果而避免砍中炸弹,就可以 ...

  4. L3-021 神坛 (30 分)-PAT 团体程序设计天梯赛 GPLT

    在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面 ...

  5. L3-020 至多删三个字符 (30 分)-PAT 团体程序设计天梯赛 GPLT

    给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 输入格式: 输入在一行中给出全部由小写英文字母组成的.长度在区间 [4, 106] 内的字符串. ...

  6. L3-016 二叉搜索树的结构 (30 分)-PAT 团体程序设计天梯赛 GPLT

    二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值:它的左.右子树也分别 ...

  7. L3-009 长城 (30 分)-PAT 团体程序设计天梯赛 GPLT

    正如我们所知,中国古代长城的建造是为了抵御外敌入侵.在长城上,建造了许多烽火台.每个烽火台都监视着一个特定的地区范围.一旦某个地区有外敌入侵,值守在对应烽火台上的士兵就会将敌情通报给周围的烽火台,并迅 ...

  8. L3-023 计算图 (30 分)--PAT 团体程序设计天梯赛 GPLT

    "计算图"(computational graph)是现代深度学习系统的基础执行引擎,提供了一种表示任意数学表达式的方法,例如用有向无环图表示的神经网络. 图中的节点表示基本操作或 ...

  9. L3-022 地铁一日游 (30 分)-PAT 团体程序设计天梯赛 GPLT

    森森喜欢坐地铁.这个假期,他终于来到了传说中的地铁之城--魔都,打算好好过一把坐地铁的瘾! 魔都地铁的计价规则是:起步价 2 元,出发站与到达站的最短距离(即计费距离)每 K 公里增加 1 元车费. ...

最新文章

  1. python的turtle绘图体系入门必看(一)
  2. 强行分类提取特征自编码网络例1
  3. 技术人员写blog的好处
  4. 关于导入oracle10g的数据到sqlserver2005里的方案总结
  5. 【Linux系统编程学习】 静态库的制作与使用
  6. 【转载】谷歌是如何做代码审查的
  7. css+div导航条样式
  8. python matlabplot写字_Matlab中plot基本用法的具体使用
  9. opencv-api draw
  10. 【计算机本科补全计划】Mysql 学习小计(3)
  11. [ACM_几何] F. 3D Triangles (三维三角行相交)
  12. python函数式编程-装饰器
  13. 由于计算机是中文名ccs软件安装出现错误_UG软件不会解决的二十个问题解决方法总结...
  14. 1024福利|硬核无Bug,码上有红包!
  15. 游戏修改器制作教程五:OllyDBG和其他调试工具
  16. 使用360安全卫士对计算机进行体检,360安全卫士使用教程 电脑体检
  17. 在excel中如何筛选重复数据_EXCEL里如何快速统计重复的次数?
  18. react 实战案例(webpack构建)
  19. VLC 21年,重新审视低延迟直播
  20. 小程序全局数据,tost弹窗

热门文章

  1. python函数类_python函数、类
  2. Java在特定情境中使用的技巧
  3. tomcat 报错:Error occurred during initialization of VM
  4. python day11
  5. 6.1-6.4 压缩打包介绍,压缩工具gzip,bzip2, xz
  6. php7扩展安装奇葩事
  7. FreeRTOS(一)——任务管理
  8. iPhone 手机烧号的一些概念:五码烧号 vs OTA烧号
  9. 没有mysql支持时的替代方案
  10. Windows Mobile获取通话记录 C#