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 ...
随机推荐
- 通过run configuration启动项目
系统通过配置加载路径是通过classpath加载绝对路径 设置属性选中某个项目,然后在工具栏中选择"Run-->Run Confgurations“,然后在对话框的右边选择" ...
- 2017.2.20 activiti实战--第五章--用户与组及部署管理(一)用户与组
学习资料:<Activiti实战> 第五章 用户与组及部署管理(一)用户与组 内容概览:讲解activiti中内置的一套用户.组的关系,以及如何通过API添加.删除.查询. 5.1 用户与 ...
- LeetCode 206 Reverse Linked List(反转链表)(Linked List)(四步将递归改写成迭代)(*)
翻译 反转一个单链表. 原文 Reverse a singly linked list. 分析 我在草纸上以1,2,3,4为例.将这个链表的转换过程先用描绘了出来(当然了,自己画的肯定不如博客上面精致 ...
- frame框架及其实例
框架概念 : 谓框架便是网页画面分成几个框窗,同时取得多个 URL.只需要 <FRAMESET> <FRAME> 即可,面所有框架标记需要放在一个总起的 html 档,这个档案 ...
- Matlab 绘图全方位分析及源码
Matlab绘图 强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数.此外,M ...
- 【Web API系列教程】3.10 — 实战:处理数据(公布App到Azure App Service)
在这最后一节中.你将把应用程序公布到Azure.在Solution Explorer中,右击项目并选择Publish. 点击Publish打开Publish Web对话框. 假设你在新建项目的时候选中 ...
- Excel工作表忘记密码如何破解?
第一种方法就是按住快捷键ALT+F11,然后切换出VBA编辑窗口,如图一:在该窗口的左侧我们的选择那个忘记密码的工作表,比如sheet 1... 2 然后我们复制以下代码 “Sub Pojie()Ac ...
- eclipse.ini配置文件
Eclipse安装Maven插件后,Eclipse启动问题:Maven Integration for Eclipse JDK Warning. 解决方法: 1. 设置Eclipse使用的JRE为本 ...
- servletResponse 随机生成图片验证码
/***********************************servlet页面************************************/ package response; ...
- Codeforces 558(C、D、E)总结
558C 题意:给你n个数,可对每一个数进行操作(乘2或者除以2).求最少的操作使得全部的数都相等. 思路 : dp[ t ] 表示全部的数转化到 t 所需的最少操作, vis[ t ] 表示有多少数 ...