nyoj1099 四点坐标判断正方形

题目要求是给定四个点的坐标,判断是否可以构成正方形

原题

样例输入

1
1 1
-1 1
-1 -1
1 -1

样例输出

Yes

解题思路:因为四个点是乱序,于是想判断四点构成的6边是否有四短两长(四边相等对角线相等),用set存放边长来判断是否只有两种长度,用数组判断长短边的数目其实不用set用数组排序也可以。问题的坑:1、不能忽视边为0的情况2、不能忽视底边和对角线相等的等腰梯形(三长三短的情况,应该是情况之一QAQ)
#include <iostream>
#include<cmath>
#include <set>
using namespace std;
double magic[2][4] = {0};
double side[6] = {0};//存放6边长度
int index = 0;
//得到两点确定的边长
double getLength(int p1,int p2){
    return pow((magic[0][p1]-magic[0][p2]),2)+pow((magic[1][p1]-magic[1][p2]),2);
}
//得到相同边长的数目
int getSideNum(double s){
    int result = 0;
    for(int i=0;i<6;i++){
        if(side[i]==s){
            result++;
        }
    }
    return result;
}
int main(int argc, char** argv) {
    set<double> s;
    int n;
    cin>>n;
    while(n--){
        for(int i=0;i<4;i++){
            for(int j=0;j<2;j++){
                cin>>magic[j][i];
            }
        }
        index = 0;
        for(int i=0;i<3;i++){
            for(int j=i+1;j<4;j++){
                s.insert(getLength(i,j));
                side[index++] = getLength(i,j);
            }
        }
        if(s.size()!=2){
            cout<<"No"<<endl;
        }else{
            if(*s.begin()*2== *(++s.begin())&&getSideNum(*s.begin())==4&&*s.begin()!=0){
                cout<<"Yes"<<endl;
            }else{
                cout<<"No"<<endl;
            }
        }
        s.clear();//记得清空
    }
    return 0;
}

 

原文地址:https://www.cnblogs.com/zhaoGavin/p/8638555.html

时间: 2024-10-14 00:42:05

nyoj1099 四点坐标判断正方形的相关文章

hdu 5365 判断正方形

题意:给出n个点(坐标均为整数),判断可以构成多少个正三角形.正四边形.正五边形.正六边形. 官方题解:地球人都知道整点是不能构成正五边形和正三边形和正六边形的,所以只需暴力枚举四个点判断是否是正四边形即可.假如你不是地球人,那么即使暴力枚举正三边形和稍微不那么暴力地找正五边形和正六边形也是可以通过的(反正找不到). ......看来我不是地球人...... 至于判断正方形,只要判断四边相等和一条对角线是边长的根号2倍就行了. 1 #include <iostream> 2 #include

HNU 12886 Cracking the Safe 二十四点的判断

经典的一个题,今天竟然写跪了…… 题意: 给你4个数字,让你判断是否能通过四则运算和括号,凑成24点. 思路: 暴力枚举运算顺序和运算符. 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <algorithm> 7 #include <stri

java 空间四点定位,可跟据已知的四点坐标(x,y,z)及距离计算所在位置坐标

public static void main(String args[]) { try{ float point[]=new float[3]; Location loc = new Location(); //获得坐标 point[0] = 0; point[1] = 0; point[2] = (float) 0.5; loc.set_point(point,1); point[0] = 0; point[1] = -1; point[2] = 2; loc.set_point(point

知源图四点坐标和目标图四点坐标,求透视变换矩阵

最近在搞图像处理,碰到了透视变换的问题. 同事给我一些代码,里边有误差,挺严重,让我帮他想想哪里出错了.捣鼓了很久,我猜测肯定是透视变换矩阵求错了,然后我的透视变换之旅就开始了. 后来问题解决了,发现他的矩阵和我求得矩阵一摸一样,他的代码并没有错误,是他采用的图片在做广角变换的时候有误差,导致程序结果误差. 首先感谢xiaowei_cqu,是她的一篇博客(http://blog.csdn.net/xiaowei_cqu/article/details/26471527)教会了我变换原理. 后来去

RN 手势响应系统基本用法和获取坐标判断用户手势方向

1. 基本使用,注意两点 (1)将手势系统的函数放在“componentWillMount”生命周期函数里面,当时会有警告,警告自己看吧 (2)将方法使用ES6扩展运算符展开 import React from 'react'; import {View,Text} from 'react-native'; export default class My extends React.Component{ constructor(props){ super(props); } UNSAFE_com

在Flex中判断是否在组件之外单击的技巧

在Flex中判断是否在组件之外单击的技巧 昨天在做Flex开发的时候,遇到了这样一种操作,之前也遇到过,那时的办法不是很好,今天又碰上了类似的问题,先看一张图吧! 这是系统界面大概的样子,现在的情况是,红色区域是一个窗口.页面.组件这样的,需要在这个组件之外的地方单击就隐藏这个组件,以前的想法很简单,就是通过坐标判断,但是现在这个红色的区域的结构比较复杂,所以不知道有什么样的方式可以解决,后来遇到了一个网友,给了我一段代码,我觉得还不错,我觉得算是技巧性的东西吧!所以分享一下: 首先,在黑色的区

h5触摸事件-判断上下滑动

// 判断上下滑动 var startX = 0, startY = 0; function touchStart(evt){ try{ var touch = evt.touches[0], //获取第一个触点 x = Number(touch.pageX), //页面触点X坐标 y = Number(touch.pageY); //页面触点Y坐标 //记录触点初始位置 startX = x; startY = y; }catch(e){ console.log(e.message) } }

[题解]UVA1603 破坏正方形 Square Destroyer

是一道启发式搜索和位运算,剪枝的杂合题目. 要学好搜索,搜索是很重要的算法.那些很厉害的选手都是搜索打得好的.(By Instructor Li) 题目分析 首先,\(N≤5\),且边数是\(2N(N+1)≤60\).在这样的小数据下可以位运算优化. 启发式搜索,设计估价函数\(G(X)\).要求低于真实代价.下面是一种方法: 对于每一个正方形,删除它的所有边.重复这个操作知道没有正方形.操作的次数就是估价 然而,仅仅这样不足以过掉这题.还需要优化. 判断正方形 在纸上推导一下,或者直接找规律,

【开源项目解析】QQ“一键下班”功能实现解析——学习Path及贝塞尔曲线的基本使用

早在很久很久以前,QQ就实现了"一键下班"功能.何为"一键下班"?当你QQ有信息时,下部会有信息数量提示红点,点击拖动之后,就会出现"一键下班"效果.本文将结合github上关于此功能的一个简单实现,介绍这个功能的基本实现思路. 项目地址 https://github.com/chenupt/BezierDemo 最终实现效果 实现原理解析 我个人感觉,这个效果实现的很漂亮啊!那么咱们就来看看实现原理是什么~ 注:下面内容请参照项目源码观看. 其