可能我写的比较繁琐。。。。。。。。
package tencent.simulation;
import java.util.Scanner;
/**
* 输入一个整数t,表示有几组数据
* 输入t组数据
* 每组
* 第一行输入四个整数,代表四个横坐标
* 第二行输入四个整数,代表四个纵坐标
* 根据输入的坐标,判断是否能构成一个正方形
*
* 样例输入
* 3
* 0 0 2 2
* 0 2 0 2
* 0 1 5 6
* 1 6 0 5
* 3 5 6 4
* 0 3 6 9
*
* 样例输出
* Yes
* Yes
* No
*
* 解题难点:怎样根据输入的坐标判断是否可以组成一个正方形
*
* 分析:
* 正方形的四边相等,四个角为直角
* 每个正方形可看做两个等腰直角三角形组成
* 如果这四个点中任意三个点可组成直角三角形,那么这四个点可以构成正方形
*
* @author 花花
*
*/
public class TestSquare {
/**
*
* 首先判断任意三个点是否呢个组成一个等腰直角三角形
* 每个正方形可以看成是由两个等腰直角三角形组成
* @param x
* @param y
* @return
*/
public static boolean isTrangle(int[] x,int[] y) {
boolean flag1=false;//等腰标志
boolean flag2=false;//直角标志
int[] d=new int[3];//存储这三点之间的距离的平方
for(int i=0,k=0;(i<3)&&(k<3);i++,k++) {//length=4,任选三个点,例如x0,x1,x2,计算这三个点之间的距离
if(k<2&&i<2) {
d[k]=(x[i]-x[i+1])*(x[i]-x[i+1])+(y[i]-y[i+1])*(y[i]-y[i+1]);
}
else {
d[k]=(x[0]-x[2])*(x[0]-x[2])+(y[0]-y[2])*(y[0]-y[2]);
}
}
int c=d[0];//长边
int a=0;//等腰的短边
for(int i=1;i<d.length;i++) {
//如果有任意两条边相等,则为等腰三角形
if(d[i]==d[i-1]) {//比较d1,d0 d2,d1
flag1=true;
a=d[i];
}
if(d[i]>d[i-1]) {//挑出最长的那条边
c=d[i];
}
}
if(d[0]==d[2]) {//还有d0,d2需要进行比较
flag1=true;
a=d[0];
}
if(!flag1) {//如果不是等腰三角形,则肯定不是正方形
return false;
}
if(a*2==c) {
flag2=true;
}
return flag1&&flag2;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int t=sc.nextInt();
int[] x=new int[4];
int[] y=new int[4];
boolean[] flags= new boolean[t];//记录是否为正方形
for(int k=0;k<t;k++) {
int[] d=new int[3];
for(int i=0;i<4;i++) {
x[i]=sc.nextInt();
}
for(int j=0;j<4;j++) {
y[j]=sc.nextInt();
}
boolean f1=TestSquare.isTrangle(new int[]{x[0],x[1],x[2]},new int[]{y[0],y[1],y[2]});
boolean f2=TestSquare.isTrangle(new int[]{x[0],x[2],x[3]},new int[]{y[0],y[2],y[3]});
flags[k]=f1&&f2;
}
for(boolean b:flags) {
if(b) {
System.out.println("Yes");
}
else {
System.out.println("No");
}
}
}
}
运行结果: