騰訊2018春招模擬——程式設計題1——4個點能否構成正方形
阿新 • • 發佈:2019-01-07
題目
判斷輸入的4個點是否構成正方形
輸入t組資料,每組資料包含兩行,一行是4個點的橫座標,一行是4個點的縱座標
示範輸入:
2
0 0 1 1
0 1 0 1
0 1 5 6
1 6 0 5
示範輸出:
Yes
Yes
我的思路
判斷任意3個點是否構成等腰直角三角形,如果是,則為正方形。
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int t = in.nextInt();
String[] result = new String[t];
int[] x=new int[4];
int[] y=new int[4];
for (int i=0;i<t;i++){
for (int j=0;j<4;j++){
x[j]=in.nextInt();
}
for (int j=0;j<4;j++){
y[j]=in.nextInt();
}
if (isRec(getLength(x[0],y[0],x[1],y[1]),getLength(x[1],y[1],x[2],y[2]),getLength(x[0],y[0],x[2],y[2]))
&& isRec(getLength(x[0],y[0],x[1],y[1]),getLength(x[0],y[0],x[3],y[3]),getLength(x[1],y[1],x[3],y[3]))
&&isRec(getLength(x[1],y[1],x[3],y[3]),getLength(x[1 ],y[1],x[2],y[2]),getLength(x[2],y[2],x[3],y[3]))
&&isRec(getLength(x[0],y[0],x[2],y[2]),getLength(x[0],y[0],x[3],y[3]),getLength(x[2],y[2],x[3],y[3]))
)
result[i]="Yes";
else
result[i]="No";
}
for (int i=0;i<result.length;i++)
System.out.println(result[i]);
}
static boolean isRec(int a,int b,int c){
return a + b == c || a + c == b || b + c == a;
}
static int getLength(int x1,int y1,int x2,int y2){
return (int)(Math.pow(x1-x2,2)+Math.pow(y1-y2,2));
}
缺點
計算量太大,程式設計複雜,耗時多,容易出錯。
優化思路
這四個點相互之間的距離只有兩種,用一個數組用於儲存這些點之間的距離,求出兩兩點之間的距離,若陣列不存在所求的距離數值,則新增進陣列,若陣列超過三個數值,則返回FALSE,最終陣列只有2個數值且數值之比為1比根號2,則為TRUE
/**
* 計算給定的4個點是否可以構成正方形
*/
public class isSquare {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int t = in.nextInt();
String[] result = new String[t]; //儲存結果的陣列
int[] x=new int[4];
int[] y=new int[4];
List<Integer> list =new ArrayList<>(); //儲存任意兩點間的距離(不重複)
for (int i=0;i<t;i++){
list.clear(); //將list情況,避免影響下一輪結果
for (int j=0;j<4;j++){ //讀入x座標
x[j]=in.nextInt();
}
for (int j=0;j<4;j++){ //讀入y座標
y[j]=in.nextInt();
}
for (int k=0;k<4;k++){ //遍歷(0,1)(0,2)(0,3)(1,2)(1,3)(2,3)幾個點對
for (int m=k+1;m<4;m++){
int len= getLength(x[k],y[k],x[m],y[m]);//判斷並存儲兩點間的距離
if (!list.contains(len))
list.add(len);
}
}
if (list.size()==2){
int a=list.get(0)>list.get(1)? list.get(0)/list.get(1):list.get(1)/list.get(0);
if (a==2) { //如果距離只有兩種,且兩調邊長度的平方是2倍關係,那麼是正方形
result[i] = "Yes";
continue;
}
}
result[i] = "No";
}
for (String aResult : result) System.out.println(aResult);
}
/**
* 計算兩個點之間的距離的平方
* @param x1 點1的橫座標
* @param y1 點1的縱座標
* @param x2 點2的橫座標
* @param y2 點2的縱座標
* @return 兩點間距離的平方
*/
static int getLength(int x1,int y1,int x2,int y2){
return (int)(Math.pow(x1-x2,2)+Math.pow(y1-y2,2));
}
}
測試結果
2
0 0 1 1
0 1 0 1
0 1 5 6
1 6 0 5
Yes
Yes