给定2D空间中四个点的坐标 p1, p2, p3 和 p4,如果这四个点构成一个正方形,则返回 true 。
点的坐标 pi 表示为 [xi, yi] 。输入 不是 按任何顺序给出的。
一个 有效的正方形 有四条等边和四个等角(90度角)。
输入: p1 = [0,0], p2 = [1,1], p3 = [1,0], p4 = [0,1]
输出: True
输入:p1 = [0,0], p2 = [1,1], p3 = [1,0], p4 = [0,12]
输出:false
输入:p1 = [1,0], p2 = [-1,0], p3 = [0,1], p4 = [0,-1]
输出:true
p1.length == p2.length == p3.length == p4.length == 2
-104 <= xi, yi <= 104
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-square
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
为了简化解题步骤,应该只针对一种属性进行判断。
从边来说,四边相等且两对角线相等且对角线长为边长的/sqrt{2}倍
从角来说,四边夹角与两对角线夹角均为90°
但从编写难易程度来说,选用边判断比较方便。
既是菱形又是矩形的图形是正方形,菱形的四条边相等,矩形对角线相等,那么只要求出六条边的长度即可。
- class Solution {
- public:
- static bool validSquare(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4)
- {
- map<int, int> lengths; /*以长度为key,该长度出现的次数为value*/
- int longest = INT_MIN, shortest = INT_MAX;
- vector
int>> edges; /*方便求边长的简单处理*/ - edges.emplace_back(p1);
- edges.emplace_back(p2);
- edges.emplace_back(p3);
- edges.emplace_back(p4);
- for (int i = 0; i < 3; ++i)
- for (int j = i + 1; j < 4; ++j)
- {
- int x_diff = edges[i][0] - edges[j][0]; /*求横坐标的差*/
- int y_diff = edges[i][1] - edges[j][1]; /*求纵坐标的差*/
- int length = abs(x_diff * x_diff) + abs(y_diff * y_diff); /*为了避免精度问题,这里取距离的平方*/
- longest = max(longest, length); /*保存可能的对角线长*/
- shortest = min(shortest, length); /*保存可能的边长*/
- ++lengths[length];
- }
- if (lengths[shortest] == 4 && lengths[longest] == 2 && longest== 2 * shortest) return true;
- /*只有四边相等&&两对角线相等&&对角线长度平方为边长平方之两倍时,才是正方形*/
- else return false;
- }
- };