首页 > 代码库 > hihoCoder - 1040 - 矩形判断 (简单计算几何~)
hihoCoder - 1040 - 矩形判断 (简单计算几何~)
#1040 : 矩形判断
时间限制:1000ms
单点时限:1000ms
内存限制:256MB
- 样例输入
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
描述
给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形。
输入
输入第一行是一个整数T(1<=T<=100),代表测试数据的数量。
每组数据包含4行,每行包含4个整数x1, y1, x2, y2 (0 <= x1, y1, x2, y2 <= 100000);其中(x1, y1), (x2,y2)代表一条线段的两个端点。
输出
每组数据输出一行YES或者NO,表示输入的4条线段是否恰好围成矩形。
思路:首先判断四条边中的两个点是否两两重合,,即总共只有四个点(用set实现)
判断出只有四点之后,,则这是一个四边形,,然后在判断一条边和其他边的关系是否只有垂直和平行两种关系即可
AC代码:
#include <cstdio> #include <cstring> #include <algorithm> #include <set> using namespace std; struct point { int x, y; bool operator < (const point& p2) const //用于排序 { //先判断横坐标 if(x<p2.x||(x==p2.x&&y<p2.y)) return true; return false; } bool operator == (const point& p2) const //用于判等 { return (x==p2.x&&y==p2.y); } }; struct line { point p1, p2; }; int judgePoint(line *l) { set<point> s; for(int i=0; i<4; i++) { s.insert(l[i].p1); s.insert(l[i].p2); } return (s.size() == 4); } int judgeRect(line *l) { for(int i=1; i<4; ++i) { //判断是不是垂直 if((l[0].p1.y-l[0].p2.y)*(l[i].p1.y-l[i].p2.y)==-(l[0].p1.x-l[0].p2.x)*(l[i].p1.x-l[i].p2.x)) continue; //判断是不是平行 if((l[0].p1.y-l[0].p2.y)*(l[i].p1.x-l[i].p2.x)==(l[0].p1.x-l[0].p2.x)*(l[i].p1.y-l[i].p2.y)) continue; return false; } return true; } int main() { line l[4]; int T; scanf("%d", &T); while(T--) { for(int i=0; i<4; i++) scanf("%d %d %d %d", &l[i].p1.x, &l[i].p1.y, &l[i].p2.x, &l[i].p2.y); int flag = 0; if(judgePoint(l) && judgeRect(l)) flag = 1; if(flag) printf("YES\n"); else printf("NO\n"); } return 0; }
hihoCoder - 1040 - 矩形判断 (简单计算几何~)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。