腾讯模拟笔试编程题--根据输入的点坐标判断是够能构成一个正方形

可能我写的比较繁琐。。。。。。。。

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");
            }
        }
    }
}

运行结果:
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值