问题
解题
思路一:
- 找到最长的两条就是对角线,对角线垂直且相等以及对角线中点重合,确定一条,另两个点确定另外一条对角线。
class Solution {
//四个点六条边,最长的两条就是对角线,对角线垂直且相等以及对角线中点重合,确定一条,另两个点确定另外一条对角线
public boolean isSame(int[] p1, int[] p2){
return p1[0] == p2[0] && p1[1] == p2[1];
}
public boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {
int[][] p = {p1, p2, p3, p4};
if(isSame(p1, p2) || isSame(p1, p3) || isSame(p1, p4) || isSame(p2, p3) || isSame(p3, p4)){
return false;
}
int x1 = 0;
int y1 = 0;
int x2 = 0;
int y2 = 0;
int x3 = 0;
int y3 = 0;
int x4 = 0;
int y4 = 0;
int num1 = -1;
int num2 = -1;
double len1 = -1;
for(int i = 0; i < 3; i ++){
for(int j = i + 1; j < 4; j ++){
double t = Math.sqrt((p[i][0] - p[j][0])*(p[i][0] - p[j][0]) + (p[i][1] - p[j][1])*(p[i][1] - p[j][1]));
if(t > len1){
len1 = t;
x1 = p[i][0];
y1 = p[i][1];
x2 = p[j][0];
y2 = p[j][1];
num1 = i;
num2 = j;
}
}
}
int num3 = -1;
int num4 = -1;
for(int i = 0; i < 4; i ++){
if(i == num1 || i == num2){
continue;
}
if(num3 == -1) num3 = i;
else num4 = i;
}
x3 = p[num3][0];
y3 = p[num3][1];
x4 = p[num4][0];
y4 = p[num4][1];
double len2 = Math.sqrt((x3 - x4)*(x3 - x4) + (y3 - y4)*(y3 - y4));
if(len2 != len1){
return false;
}
//对角线叉乘为0且两个对角线中点重合
return (x1 - x2)*(x3 - x4) + (y1 - y2) * (y3 - y4) == 0 && ((x1 + x2) == (x3 + x4) && (y1 + y2) == (y3 + y4));
}
}
思路二:
- 求出六条边来,然后对每条边的长度进行排序,如果是正方形,则前四条长度相等为边长,后两条最长且长度相等。
class Solution {
public boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {
int[][] p = {p1,p2,p3,p4};
int[] dis = new int[6];
int k = 0;
for(int i = 0; i < 3; i ++){
for(int j = i + 1; j < 4; j ++){
dis[k ++] = distance(p[i], p[j]);
}
}
Arrays.sort(dis);
for(int i = 0; i < 3; i ++){
if(dis[i] != dis[i + 1]){
return false;
}
}
if(dis[4] == dis[3]) return false;//对角线和边长一样长返回false
return dis[4] == dis[5];
}
public int distance(int[] p1, int[] p2){
//为了省时间,不求开方
return (p1[0] - p2[0])*(p1[0] - p2[0]) + (p1[1] - p2[1])*(p1[1] - p2[1]);
}
}