1. 程式人生 > >騰訊2018春招模擬——程式設計題1——4個點能否構成正方形

騰訊2018春招模擬——程式設計題1——4個點能否構成正方形

題目

判斷輸入的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