描述
-
给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形。
- 输入
-
输入第一行是一个整数T(1<=T<=100),代表测试数据的数量。
每组数据包含4行,每行包含4个整数x1, y1, x2, y2 (-100000 <= x1, y1, x2, y2 <= 100000);其中(x1, y1), (x2,y2)代表一条线段的两个端点。 - 输出
- 每组数据输出一行YES或者NO,表示输入的4条线段是否恰好围成矩形。
- 样例输入
-
3 0 0 0 1 1 0 1 1 0 1 1 1 1 0 0 0 0 1 2 3 1 0 3 2 3 2 2 3 1 0 0 1 0 1 1 0 1 0 2 0 2 0 1 1 1 1 0 1
- 样例输出
-
YES YES NO
- 思路:
- 我是根据矩形的定义来的(1.矩形定义:有一个直角的平行四边形;2.平行四边形定义:两对边平行的四边形),代码注释中有详解。
- 【nyoj1228矩形判断】AC代码:
-
#include #include using namespace std; struct node{ int x, y, cnt; }p[8]; int main() { int t, i, j, k; double K[4], max = 1.0/0.0; struct node b[8]; scanf("%d", &t); while(t--) { for(i = 0, k = 0; i < 8; i++) { b[i].cnt = 0; scanf("%d%d", &p[i].x, &p[i].y); for(j = 0; j < k; j++) { if(p[i].x == b[j].x && p[i].y == b[j].y) { b[j].cnt++; break; } } if(j == k) { b[k].x = p[i].x; b[k].y = p[i].y; b[k++].cnt++; } if(i%2) K[i/2] = (p[i].y-p[i-1].y+0.0)/(p[i].x-p[i-1].x+0.0); } char fag = 1; if(b[0].cnt!=2||b[1].cnt!=2||b[2].cnt!=2||b[3].cnt!=2) fag = 0; //四条边要构成四边形的话四边形的每个顶点都应该出现两次,否则不是四边形 else { sort(K,K+4); if(K[0] != K[1] || K[2] != K[3]) fag = 0; //判断是否为平行四边形 else { if(K[0]*K[3] != -1) fag = 0; //没有直角则不是矩形 if(K[0]==0&&K[2]==max) fag = 1; //一边斜率为0,一边没有斜率与y轴平行的情况也要考虑 } } if(fag) printf("YES\n"); else printf("NO\n"); } return 0; }
推荐阅读
- 人工智能|干货!人体姿态估计与运动预测
- 分析COMP122 The Caesar Cipher
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)
- C语言学习(bit)|16.C语言进阶——深度剖析数据在内存中的存储
- Python机器学习基础与进阶|Python机器学习--集成学习算法--XGBoost算法
- 数据结构与算法|【算法】力扣第 266场周赛
- 数据结构和算法|LeetCode 的正确使用方式
- leetcode|今天开始记录自己的力扣之路
- 人工智能|【机器学习】深度盘点(详细介绍 Python 中的 7 种交叉验证方法!)
- 网络|简单聊聊压缩网络