hihoCoder - 1040 - 矩形判断 (简单计算几何~)

#1040 : 矩形判断

时间限制:1000ms

单点时限:1000ms

内存限制:256MB

描述

给出平面上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条线段是否恰好围成矩形。

样例输入
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

思路:首先判断四条边中的两个点是否两两重合,,即总共只有四个点(用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;
}
时间: 2024-10-19 11:32:31

hihoCoder - 1040 - 矩形判断 (简单计算几何~)的相关文章

hihocoder #1040 矩形判断(计算几何问题 给8个点的坐标,能否成为一个矩形 【模板思路】)

#1040 : 矩形判断 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给出平面上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,表示输入的

hihoCoder 1040 矩形判断(计算几何)

http://hihocoder.com/problemset/problem/1040 首先判断四条线段是否相交,给出八个点,如果有一些点重合,并且不同坐标的点只有4个的话,表示可以构成四边形. 然后判断每一条线段与其他线段树平行或者垂直,每一条线段都和其他线段平行或垂直的话就能构成矩形. 平行或相交可以用斜率计算,注意斜率不存在或者等于0的情况. 平行斜率相等,垂直的话斜率相乘等于-1,或者一个不存在一个为0. 1 #include<iostream> 2 #include<cstd

hihoCoder #1040 (判断是否为矩形)

题目大意:给四条线段,问能否构成一个矩形? 题目分析:先判断能否构成四边形,然后选一条边,看另外三条边中是否为一条与他平行,两条垂直. 代码如下: # include<iostream> # include<cstdio> # include<cmath> # include<set> # include<cstring> # include<algorithm> using namespace std; # define LL lo

hihoCoder 1040 矩阵判断

题目来源:矩阵判断 解题思路: 1.判断矩阵的4个点是否相连,一共输入8个点,只要判断是否4个点是否都经过2遍: 2.判断矩阵中任意一条边与其他边之间要么平行,要么垂直.设A(x1,y1),B(x2,y2),C(x3,y3),D(x4,y4),则线段AB的向量为A’(x2-x1,y2-y1),线段CD的向量C'(x4-x3,y4-y3),另x2-x1=a1,y2-y1=a2,x4-x3=c1,y4-y3=c2,判断A’是否平行C'的方法是a1*c2-a2*c1=0:判断A’是否垂直C'的方法是a

[hihoCoder]矩形判断

#1040 : 矩形判断 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给出平面上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,表示输入的

hihocoder 举行判断(计算几何)

判断是否为矩形,必须满足相异的4个点,存在4条边(不重合),边的向量只有两个,且两向量垂直: 满足这些条件就可以了 小知识点: 两个向量垂直(x1,y1),(x2,y2)   x1 * x2 + y1 * y2 == 0; 两个向量平行(x1,y2),(x2,y2)  x1 * y2 - x2 * y2 == 0; #1040 : 矩形判断 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形. 输入 输入

POJ 1556 The Doors(简单计算几何+最短路)

●赘述题目 10*10的房间内,有竖着的一些墙(不超过18个).问从点(0,5)到(10,5)的最短路. 按照输入样例,输入的连续5个数,x,y1,y2,y3,y4,表示(x,0--y1),(x,y2--y3),(x,y4--10)是墙壁. ●题解 方法:建图(用到简单计算几何)+最短路 ○记录下每个端点. ○包含起点,终点,以及每个墙的可以走的端点,如下图: ○然后枚举点,尝试两两组合连(线段)边,若该线不会撞在墙上,即不会与墙壁线段相交,就add_adge(). 效果图如下: 如何判断呢?

[HDU 4082] Hou Yi&#39;s secret (简单计算几何)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4082 题目大意: 给你n个点,问能最多构成多少个相似三角形. 用余弦定理,计算三个角度,然后暴力数有多少个,更新答案. 代码: 1 #include <cstdio> 2 #include <cmath> 3 #include <algorithm> 4 #include <cstring> 5 #include <vector> 6 #includ

hihocoder 1040(矩形判断)

题目链接:传送门 题目大意:给你四条线段,判断能否围成一个面积大于0的矩形,能输出YES,不能输出NO 题目思路:    合法的四条线段应该满足 1.应该必须有四个不同的点 2.线段斜率分为两组,组内相同组间不同 3.若有斜率为0或斜率不存在的线段需特判,否则看斜率不同的线段乘积==-1?"YES":"NO" #include <iostream> #include <cstdio> #include <cstdlib> #inc