牛客网算法题刷题日记(1)–魔法阵

欢迎浏览我的博客 获得更多精彩文章
https://boyn.top

牛客网算法题刷题日记(1)–魔法阵

解决问题 提交时间 状态 运行时间 占用内存 使用语言
魔法阵 2019-04-07 答案正确 14 ms 9296K Java

问题链接:

https://www.nowcoder.com/questionTerminal/04c873db99a34a0c85d476be82533b98

问题思路:

在拿到这个问题的第一时间,首先需要想一下,正方形具有什么性质:

  • 四边长度相同

  • 两条对角线垂直

  • 任意三点可以组成等腰直角三角形

    那么,我们就可以用这三个性质,来做这道题

    读入了4个点后,先拿其中三个点,判定是否为等腰直角三角形

    其中,要判断的是 长边的平方是否等于两条短边的平方加起来(勾股定理) 和 两条短边是否相同

    然后,要判断的就是两条对角边的长度是否相同,这个很好判断.

    最后放出代码:

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.IOException;
    
    public class Main{
        /**
         * main函数这里主要就是读取输入的值,并将输入值放到数组,传入到process函数中
         */
        public static void main(String[] args)throws IOException{
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int[] x = new int[4];
            int[] y = new int[4];
            int T = Integer.parseInt(br.readLine());
            for(int i = 0;i<T;i++){
                String x_axis = br.readLine();
                String y_axis = br.readLine();
                for(int j = 0;j<4;j++){
                    x[j] = Integer.parseInt(x_axis.substring(j,j+1));
                    y[j] = Integer.parseInt(y_axis.substring(j,j+1));
    
                }
                process(x,y);
            }
        }
    
        public static void process(int[] x, int[] y){
            boolean flag = false;
            int side1 =(int)Math.pow(x[0]-x[1],2)+(int)Math.pow(y[0]-y[1],2);
            int side2 =(int)Math.pow(x[1]-x[2],2)+(int)Math.pow(y[1]-y[2],2);
            int side3 =(int)Math.pow(x[0]-x[2],2)+(int)Math.pow(y[0]-y[2],2);//计算3条边的长度
            int side_max = Math.max(Math.max(side1,side2),side3);//判断最长边
            if(side_max == side1){
                if(side1 == side2+side3&&side2==side3)
                //判断最长边的平方是否等于两短边的平方加起来以及两短边长度是否相同
                {
                    int side4 = (int)Math.pow(x[2]-x[3],2)+(int)Math.pow(y[2]-y[3],2);//获取对边长度,并判断两对边是否相同
                    if(side4==side_max) flag=true;
                }
            }
            if(side_max == side2){
                if(side2 == side1+side3&&side1==side3) {
                    int side4 = (int)Math.pow(x[0]-x[3],2)+(int)Math.pow(y[0]-y[3],2);
                    if(side4==side_max) flag=true;
                }
            }
            if(side_max == side3){
                if(side3 == side2+side1&&side2==side1) {
                    int side4 = (int)Math.pow(x[1]-x[3],2)+(int)Math.pow(y[1]-y[3],2);
                    if(side4==side_max) flag=true;
                }
            }
            if(flag) System.out.println("Yes");
            else System.out.println("No");
        }
    }
    

你可能感兴趣的:(Java,算法)