hihocoder #1040 矩形判断(计算几何问题 给8个点的坐标,能否成为一个矩形 【模板思路】)
#1040 : 矩形判断
描述
给出平面上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
算法分析:我没有计算几何的模板,这道计算几何基础题就只能自己敲! 要完成这道题:首先需要知道一下知识点!
1.一个面积大于0的矩形必会有4个互不相同的顶点
2.四条边的权值相等(即邻边相等,四边等边平行四边形)或者 边的权值只有两种值(即临边不相等,而对边相等的平行四边形)
3.最后判断是不是有个角是直角(只要找到两个边互相垂直就行了, 即向量的点积运算 ) 注意:我在算法的实现的过程中用到了STL的set结构,需要注意的一点是:如果要将一个结构体引入set集合,则必须要对所有结构体的元素
进行一种重载运算符的书写。否则就会导致数据的丢失!
比如:我插入了点(0, 0),再去插入点(0,1),就可能将丢失(0, 1)点。注意!#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <iostream>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <algorithm>
#define eps 1e-8
#define PI acos(-1.0) using namespace std; struct pointer
{
int x, y;
bool operator <(const pointer&dd)const{
if(x==dd.x){
return y<dd.y;
}
return x<dd.x;
}
}u, v; set<pointer>a; //点集
set<int>b; //边集 int line(pointer a, pointer b)
{
return ((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
}
struct vect
{
int x, y;
}c[4]; int main()
{
int t;
int i, j;
scanf("%d", &t);
while(t--)
{
if(!a.empty()) a.clear();
if(!b.empty()) b.clear();
for(i=0; i<4; i++)
{
scanf("%d %d %d %d", &u.x, &u.y, &v.x, &v.y ); //读入一条边
a.insert(u); a.insert(v);
b.insert(line(u, v));
c[i].x = u.x-v.x;
c[i].y = u.y-v.y; //构建向量
}
if(a.size()!=4){
set<pointer>::iterator it=a.begin(); /* while(it!=a.end())
{
printf("%d--%d ", it->x, it->y ); it++;
} */
//printf("*******%d\n", a.size()); printf("NO\n"); continue;
}
if(b.size()>2){ //==1是正方形 ==2是长方形
printf("NO\n"); continue;
}
//如果这个四边形只有四个点, 并且只有一个或两个不同大小的边
bool flag=false;
for(i=0; i<4; i++)
{
for(j=0; j<4; j++){
if(i!=j){
if((c[i].x*c[j].x + c[i].y*c[j].y) ==0 )
{
flag=true; break;
}
}
}
if(flag==true) break;
}
if(flag==true ) printf("YES\n");
else printf("NO\n");
}
return 0;
}
hihocoder #1040 矩形判断(计算几何问题 给8个点的坐标,能否成为一个矩形 【模板思路】)的更多相关文章
- hihoCoder #1040 (判断是否为矩形)
题目大意:给四条线段,问能否构成一个矩形? 题目分析:先判断能否构成四边形,然后选一条边,看另外三条边中是否为一条与他平行,两条垂直. 代码如下: # include<iostream> ...
- hihoCoder 1040 矩阵判断 最详细的解题报告
题目来源:矩阵判断 解题思路: 1.判断矩阵的4个点是否相连,一共输入8个点,只要判断是否4个点是否都经过2遍: 2.判断矩阵中任意一条边与其他边之间要么平行,要么垂直.设A(x1,y1),B(x2, ...
- hihoCoder 1040 矩形判断(计算几何)
http://hihocoder.com/problemset/problem/1040 首先判断四条线段是否相交,给出八个点,如果有一些点重合,并且不同坐标的点只有4个的话,表示可以构成四边形. 然 ...
- HihoCoder - 1040 矩形判断
矩形判断 给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形. Input 输入第一行是一个整数T(1<=T<=100),代表测试数据的数量. 每组数据包含4行,每行包含4 ...
- [hihoCoder]矩形判断
#1040 : 矩形判断 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形. 输入 输入第一行是一个整数T ...
- Hihocoder 1275 扫地机器人 计算几何
题意: 有一个房间的形状是多边形,而且每条边都平行于坐标轴,按顺时针给出多边形的顶点坐标 还有一个正方形的扫地机器人,机器人只可以上下左右移动,不可以旋转 问机器人移动的区域能不能覆盖整个房间 分析: ...
- 25.按要求编写一个Java应用程序: (1)编写一个矩形类Rect,包含: 两个属性:矩形的宽width;矩形的高height。 两个构造方法: 1.一个带有两个参数的构造方法,用于将width和height属性初化; 2.一个不带参数的构造方法,将矩形初始化为宽和高都为10。 两个方法: 求矩形面积的方法area() 求矩形周长的方法perimeter() (2)通过继承Rect类编写一个具有
package zhongqiuzuoye; //自己写的方法 public class Rect { public double width; public double height; Rect( ...
- 按要求编写一个Java应用程序: (1)编写一个矩形类Rect,包含: 两个属性:矩形的宽width;矩形的高height。 两个构造方法: 1.一个带有两个参数的构造方法,用于将width和height属性初化; 2.一个不带参数的构造方法,将矩形初始化为宽和高都为10。 两个方法: 求矩形面积的方法area() 求矩形周长的方法perimeter() (2)通过继承Rect类编写一个具有确定位
package com.hanqi.test; public class Rect { ; ; public double getWidth() { return width; } public vo ...
- 编写一个矩形类,私有数据成员为矩形的长( len)和宽(wid),wid设置为0,有参构造函数设置和的值,另外,类还包括矩形的周长、求面积、取矩形的长度、取矩形的长度、取矩形的宽度、修改矩形的长度和宽度为对应的形参值等公用方法。
class Rectangle { private double len, wid; public Rectangle()//求矩形周长 { len = 0; wid = 0; } public Re ...
随机推荐
- TP多条件查询
$stcount = M("Results_all")->alias('a') ->join("s_test_name as b on a.subject = ...
- vscode 折叠所有区域
- js:|| 和 && 运算符 特殊用法
引用:http://www.jb51.net/article/21339.htm 先总结一下: 几乎所有语言中||和&&都遵循“短路”原理,如&&中第一个表达式为假就不 ...
- jquery:after append appendTo三个函数的区别
1.查找元素节点 var $li = $(“ul li:eq(0)”);//获取ul标记下的第一个li,也可以写成 $(“#ulID li:eq(0)”); 2.查找元素属性 利用jq ...
- 使用matlab进行mex编译时的路径问题mexopts
matlab和vs 进行混合编程时总须要使用matlab编译mexFunction.cpp文件. 这些文件免不了使用include下的*.h和lib下的*.lib文件.举例说明.这次我 ...
- HttpWebRequest用法实例
[HttpPost] public ActionResult Setmobile() { string text = "<?xml version='1.0' encoding='UT ...
- 命令行运行java
运行TestLinuxCommand.java 代码 import java.io.BufferedReader; import java.io.BufferedWriter; import ...
- 《JavaScript》——DOM
DOM (Document Object Model) 即文档对象模型, 针对 HTML 和 XML 文档的 API (应用程序接口) .DOM 描绘了一个层次化的节点树,执行开发者加入.移除和改动页 ...
- 三、Silverlight中使用MVVM(三)——进阶
这篇主要引申出Command结合MVVM模式在应用程序中的使用 我们要做出的效果是这样的 就是提供了一个简单的查询功能将结果绑定到DataGrid中,在前面的基础上,这个部分相对比较容易实现了 我们在 ...
- Java带标签的break 和带标签的continue
最开始没有学习java 学习的是C语言然后工作开始用java,但当时并没有仔细看过java的书籍,也是大致一翻就看跟C语言很像,了解了基本语法就没有深究了,今天看书开始发现之前没有了解过的语法 带标签 ...