天梯赛练习 L3-006 迎风一刀斩 (30分) 几何关系
题目分析:
对于给出的两个多边形是否可以组成一个矩形,这里我们分以下几种情况讨论
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分) 几何关系的更多相关文章
- 天梯赛练习 L3-008 喊山 (30分) bfs搜索
题目分析: 本题是一题比较简单的bfs搜索题,首先由于数据给的比较多不能直接开二维数组存放,而是用了vector的动态的二维数组的形式存放,对于每个出发点,我们bfs向四周搜索,标记搜索过的点,遇到搜 ...
- PAT天梯赛练习 L3-004 肿瘤诊断 (30分) 三维BFS
题目分析: 可能是我的理解能力比较差,在读题的时候一直以为所有的切片是可以排列组合的,并不是按照输入顺序就定死的,那么这题就变得十分的复杂啦~~~~~,查看的题解之后发现所有的切片并没有所谓的自由组合 ...
- 团体程序设计天梯赛L3-019 代码排版(23分)
打算学完编译原理后再次实现它... 以下为比较“杂乱”的方法: 海量数据: https://pan.baidu.com/s/1Prd0ZqNLoCLLvXyJjCef3w 如果大家有发现这个程序的问题 ...
- 2018天梯赛、蓝桥杯、(CCPC省赛、邀请赛、ICPC邀请赛)校内选拔赛反思总结!
才四月份,上半年的比赛就告一段落了.. 天梯赛混子,三十个人分最低,把队友拖到了国三,蓝桥杯省二滚粗,止步京城,旅游选拔赛成功选为替补二队,啊! 不过既然已经过去,我们说些乐观的一面,积累了大赛经验是 ...
- L1-049 天梯赛座位分配 (20 分)
L1-049 天梯赛座位分配 (20 分)(Java解法) 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所 ...
- L1-049 天梯赛座位分配 (20 分)
天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位 ...
- L3-007 天梯地图 (30 分) dijkstra
本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至少存在一条可达路线. 输 ...
- L3-007 天梯地图(30 分)
本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至少存在一条可达路线. 输 ...
- 第四届CCCC团体程序设计天梯赛 后记
一不小心又翻车了,第二次痛失200分 1.开局7分钟A了L2-3,一看榜已经有七个大兄弟排在前面了,翻车 * 1 2.把L1-3 A了18分,留了两分准备抢顽强拼搏奖,最后五秒钟把题过了,万万没想到还 ...
随机推荐
- Codeforces Edu Round 64 A-D
A. Inscribed Figures 分类讨论打表即可. PS:这道题翻译有歧义. 这样稍微翻转一下,就可以是\(7\)个交点呀...(大概是我没看英文题干导致的惨案) #include < ...
- MySQL技术内幕InnoDB存储引擎(四)——表相关
表是什么? 就是关于特定实体地数据集合,是关系型数据库模型地核心. 索引组织表 什么是索引组织表? 表中数据都是根据主键的顺序组织存放的,这种存储方式就是索引组织表.就是存储在一个索引结构中的表. 也 ...
- STL——容器(Map & multimap)的插入与迭代器
1. 容器(Map & multimap)的插入 map.insert(...); //往容器插入元素,返回pair<iterator,bool> map中插入元素的四种方式 ...
- 抖音视频背景音乐提取工具v1.0
使用方法:id就是你点那个音乐分享,复制链接,然后链接有个ID(userid=后面数字就是id),就是那个,输入ID之后得到链接,浏览器新建下载,复制你得到的链接就行了(结果空白多解析几次就行了)
- 前端面试题CSS-div宽度设置为100%,设置属性margin-left和margin-right时出现的问题
前端面试题CSS-div宽度设置为100%,设置属性margin-left和margin-right时出现的问题 div格式如下 <div class="a"> < ...
- 关于golang的time包总结
目录 前言 time包详解 总结 前言 各种编程语言都少不了与时间有关的操作,因为很多判断都是基于时间,因此正确和方便的使用时间库就很重要额. golang提供了import "time&q ...
- Greenplum 性能优化之路 --(三)ANALYZE
一.为什么需要 ANALYZE 首先介绍下 RBO 和 CBO,这是数据库引擎在执行 SQL 语句时的2种不同的优化策略. RBO(Rule-Based Optimizer) 基于规则的优化器,就是优 ...
- 多任务-python实现-生成器相关(2.1.13)
@ 目录 1.概念 2.创建方法 3.通过send方式来启动 1.概念 通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占 ...
- 抢先看:笔者亲历的2020年中国.NET开发者大会活动纪实
2020年中国.NET开发者大会活动纪实 1 2020年12月19日的苏州工业园区,天公作美,阳光明媚,气象迷人,正是一个搞事的好日子.在这里,数百名中国.NET开发者们汇聚一堂,怀揣着激情和梦想,一 ...
- 干货满满:python实现二维图制作
python全代码如下 import re import csv import matplotlib.pyplot as plt x=[] y=[] m=eval(input()) #输入折线条数 f ...