给定二维空间中四点的坐标,返回四点是否可以构造一个正方形。
一个点的坐标(x,y)由一个有两个整数的整数数组表示。
示例:
输入: p1 = [0,0], p2 = [1,1], p3 = [1,0], p4 = [0,1]
输出: True
注意:
- 所有输入整数都在 [-10000,10000] 范围内。
- 一个有效的正方形有四个等长的正长和四个等角(90 度角)。
- 输入点没有顺序。
四条边相等的是菱形,对角线也相等的是正方形
- 每两个点算一下距离
- 如果出现 0 肯定不是
- 如果是正方形只有两种距离的结果,要么是边要么是对角线,且是四条边,两条对角线
- 如果是两个等边三角形组成的菱形,会出现 4 条边和一条对角线相等,另外一条对角线不相等的情况,所以要判断是四条边,两条对角线
class Solution {
public:
bool validSquare(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4) {
unordered_map<int, int> st;
st[getLength(p1, p2)]++;
st[getLength(p1, p3)]++;
st[getLength(p1, p4)]++;
st[getLength(p2, p3)]++;
st[getLength(p2, p4)]++;
st[getLength(p3, p4)]++;
return st.size() == 2 && (st.begin(0)->second == 2|| st.begin(0)->second ==4) ;
}
int getLength(vector<int>& p1, vector<int>& p2){
return (p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]);
}
};