题目描述
给定二维空间中四点的坐标,返回四点是否可以构造一个正方形。
一个点的坐标(x,y)由一个有两个整数的整数数组表示。
示例:
输入: p1 = [0,0], p2 = [1,1], p3 = [1,0], p4 = [0,1]
输出: True
注意:
所有输入整数都在 [-10000,10000] 范围内。
一个有效的正方形有四个等长的正长和四个等角(90度角)。
输入点没有顺序。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-square
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
又丑又长又麻烦啊啊啊啊
class Solution {
public:
bool validSquare(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4) {
vector<pair<int,int>> tmp;
tmp.push_back(make_pair(p1[0],p1[1]));
tmp.push_back(make_pair(p2[0],p2[1]));
tmp.push_back(make_pair(p3[0],p3[1]));
tmp.push_back(make_pair(p4[0],p4[1]));
unordered_map<long long,vector<int>> mp;
for(int i=1;i<4;i++){
long long dis = (tmp[0].first - tmp[i].first)*(tmp[0].first - tmp[i].first) + (tmp[0].second - tmp[i].second)*(tmp[0].second - tmp[i].second);
if(mp.find(dis) == mp.end()){
vector<int> t = {i};
mp[dis] = t;
}else mp[dis].push_back(i);
}
if(mp.size()!=2) return false;
auto it1 = mp.begin();
auto it2 = mp.begin();
it2++;
if(it2->second.size() == 2) swap(it1,it2);
long long d = (tmp[it1->second[0]].first - tmp[it1->second[1]].first)*(tmp[it1->second[0]].first - tmp[it1->second[1]].first) + (tmp[it1->second[0]].second - tmp[it1->second[1]].second)*(tmp[it1->second[0]].second - tmp[it1->second[1]].second);
if(d != it2->first)return false;
long long k1 = (tmp[0].second - tmp[it2->second[0]].second) * (tmp[it1->second[0]].second - tmp[it1->second[1]].second);
long long k2 = (tmp[0].first - tmp[it2->second[0]].first) * (tmp[it1->second[0]].first - tmp[it1->second[1]].first);
if(k1 != -k2) return false;
k1 = (tmp[0].second - tmp[it1->second[0]].second) * (tmp[0].second - tmp[it1->second[1]].second);
k2 = (tmp[0].first - tmp[it1->second[0]].first) * (tmp[0].first - tmp[it1->second[1]].first);
if(k1 == -k2) return true;
return false;
}
};