这个题目是纯数学题了,但是需要注意一些边界case(比如边的长度为0),错了好几发了hh
证明四个点连起来是正方形就是考虑每三个点连起来都是等腰直角三角形,因此单独拧出来算等腰直角三角形就好了:
bool is_trangle(vector<int>& p1, vector<int>& p2, vector<int>& p3) {
int d1 = (p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]);
int d2 = (p1[0] - p3[0]) * (p1[0] - p3[0]) + (p1[1] - p3[1]) * (p1[1] - p3[1]);
int d3 = (p2[0] - p3[0]) * (p2[0] - p3[0]) + (p2[1] - p3[1]) * (p2[1] - p3[1]);
if(!d1 || !d2 || !d3) return false;
bool is_zhi = (d1 + d2 == d3) || (d1 + d3 == d2) || (d2 + d3 == d1);
bool is_dengyao = (d1 == d2) || (d1 == d3) || (d2 == d3);
return is_zhi && is_dengyao;
}
最后分别判断任意三个点是否满足这个条件即可:
bool validSquare(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4) {
return is_trangle(p1, p2, p3) && is_trangle(p1, p4, p3) && is_trangle(p3, p2, p4);
}
整体代码:
class Solution {
public:
bool is_trangle(vector<int>& p1, vector<int>& p2, vector<int>& p3) {
int d1 = (p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]);
int d2 = (p1[0] - p3[0]) * (p1[0] - p3[0]) + (p1[1] - p3[1]) * (p1[1] - p3[1]);
int d3 = (p2[0] - p3[0]) * (p2[0] - p3[0]) + (p2[1] - p3[1]) * (p2[1] - p3[1]);
if(!d1 || !d2 || !d3) return false;
bool is_zhi = (d1 + d2 == d3) || (d1 + d3 == d2) || (d2 + d3 == d1);
bool is_dengyao = (d1 == d2) || (d1 == d3) || (d2 == d3);
return is_zhi && is_dengyao;
}
bool validSquare(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4) {
return is_trangle(p1, p2, p3) && is_trangle(p1, p4, p3) && is_trangle(p3, p2, p4);
}
};