leetcode-593. 有效的正方形

593. 有效的正方形

 

 

 

 

class Solution {
public:
    bool validSquare(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4) {
        // 依次取得四条边的长度,注意如果任意三条边组合等腰三角形,那等腰三角形的直角边长是相等的,任意返回一个就好。
        long l1 = get(p1, p2, p3), l2 = get(p1, p2, p4), l3 = get(p1, p3, p4), l4 = get(p2, p3, p4);
        // ~l1 避免矩形,此时返回的值都为-1,
        return l1 == l2 && l1 == l3 && l1 == l4 && ~l1;
    }
    long dis(vector<int>& p1, vector<int>& p2) {
        long dx = p1[0] - p2[0], dy = p1[1] - p2[1];
        return dx * dx + dy * dy; 
    }

    long get(vector<int>& p1, vector<int>& p2, vector<int>& p3) {
        // 正方形任意三点可以组成等腰直角三角形
        long l1 = dis(p1, p2), l2 = dis(p1, p3), l3 = dis(p2, p3);
        // 选出等腰直角三角形的两条直角边,分别保存在了l1和l2中
        if (l3 < l1) swap(l3, l1);
        if (l3 < l2) swap(l3, l2);
        /*
         以下三种情况不等组成等腰直角三角形
        (1)两条直角边不相等
        (2) 不符合勾股定理
        (3)存在重合点
        */
        if (l1 != l2 || l1 + l2 != l3 || !l1) return -1;
        return l1;
    }
};

  

posted @ 2022-07-29 15:38  三一一一317  阅读(38)  评论(0)    收藏  举报