每天一道算法题-它是正方形吗【备战蓝桥】2022/3/24

每天一道算法题-它是正方形吗【备战蓝桥】2022/3/24

原题链接:它是正方形吗

题目描述

在这里插入图片描述

思路

难度不大,但以下进行了比较深的分析,有助于解决其它同类型的题目

方法一:

枚举所有排列,共A44=24种情况,对每种情况,先检测它各边是否相等,若都相等,再进一步检测对角线是否相等,若相等则是正方形。
补充:俩点间距离公式计算边长,且实际上是使用边长的平方来比较的

代码:

import java.util.Scanner;

public  class Main{
    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        point[] points=new point[4];
        for (int i = 0; i <4 ; i++) {
            points[i]=new point();
            points[i].x= scan.nextInt();
        }
        for (int i = 0; i <4 ; i++) {
            points[i].y= scan.nextInt();
        }

        for (int i = 0; i < 4; i++) { //代表左上的点
            for (int j = 0; j < 4; j++) {//左下
                for (int k = 0; k < 4; k++) {//右下
                      for (int l = 0; l < 4; l++) {//右上
                          if(j!=i&&k!=i&&k!=j&&l!=i&&l!=j&&l!=k){
                              //判断四条边是否相等(用边长的平方比较)
                              int shang=(points[i].x-points[l].x)*(points[i].x-points[l].x)+(points[i].y-points[l].y)*(points[i].y-points[l].y);
                              int zuo=(points[i].x-points[j].x)*(points[i].x-points[j].x)+(points[i].y-points[j].y)*(points[i].y-points[j].y);
                              if(shang!=zuo) continue;
                              int xia=(points[k].x-points[j].x)*(points[k].x-points[j].x)+(points[k].y-points[j].y)*(points[k].y-points[j].y);
                              if(zuo!=xia) continue;
                              int you=(points[k].x-points[l].x)*(points[k].x-points[l].x)+(points[k].y-points[l].y)*(points[k].y-points[l].y);
                              if(xia!=you) continue;
                              //检查对角线是否相等
                              int  a1=(points[k].x-points[i].x)*(points[k].x-points[i].x)+(points[k].y-points[i].y)*(points[k].y-points[i].y);
                              int  a2=(points[j].x-points[l].x)*(points[j].x-points[l].x)+(points[j].y-points[l].y)*(points[j].y-points[l].y);
                              if(a1==a2){
                                   System.out.println("It's a square");
                                   return;
                              }
                          }
                      }
                }
            }
        }
        System.out.println("Not a square");
    }
}
class point{
    int x;
    int y;
}

方法二:

将四个点按横坐标第一优先,纵坐标第二优先从小到达排序。
例如:

0 0 2 2(横坐标)
0 2 0 2(纵坐标)

排序后为:
(0,0),(0,2),(2,0),(2,2)
那么(0,0)就是四个点组成的四边形的“左下角”的点;(0,2)就是“左上角”的点;(2,0)就是“右下角”的点;(2,2)就是右上角的点。
然后检查这个四边形是不是正方形,还是先检查四条边再检查对角线。

我们默认这四个点构成了四边形,因为如果它没有构成四边形,同样无法通过检测(四天边一定不相等)

补充:代码中的冒泡排序中的判断条件是points[j].x100000+points[j].y)>(points[j+1].x100000+points[j+1].y;这里再做以下解释,这其实是把点的横坐标和纵坐标组合成一个数了,如(2,2)被组合成200002,直接比较组合后的数就可以实现第一优先比较x,第二优先比较y;其中乘以100000是因为其中告诉x和y的范围都是0到10000

代码:

import java.util.Scanner;

public  class Main{
    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        point[] points=new point[4];
        for (int i = 0; i <4 ; i++) {
            points[i]=new point();
            points[i].x= scan.nextInt();
        }
        for (int i = 0; i <4 ; i++) {
            points[i].y= scan.nextInt();
        }
        //排序(排序结果依旧放入points数组中)
        int i,j;
        for(i=0;i<3;i++){//n-1次扫描
            for(j=0;j<3-i;j++) {//每扫描依次,交换得最大次数就减一
                if((points[j].x*100000+points[j].y)>(points[j+1].x*100000+points[j+1].y)) {//逆序则交换
                    //交换j和j+1中的内容
                    point p=points[j];
                    points[j]=points[j+1];
                    points[j+1]=p;
                }
            }
        }
        //检查它是不是正方形
        int left=(points[0].x-points[1].x)*(points[0].x-points[1].x)+(points[0].y-points[1].y)*(points[0].y-points[1].y);
        int up=(points[3].x-points[1].x)*(points[3].x-points[1].x)+(points[3].y-points[1].y)*(points[3].y-points[1].y);
        int right=(points[3].x-points[2].x)*(points[3].x-points[2].x)+(points[3].y-points[2].y)*(points[3].y-points[2].y);
        int down=(points[0].x-points[2].x)*(points[0].x-points[2].x)+(points[0].y-points[2].y)*(points[0].y-points[2].y);
        if(left==up&&up==right&&right==down){
            int l1=(points[2].x-points[1].x)*(points[2].x-points[1].x)+(points[2].y-points[1].y)*(points[2].y-points[1].y);
            int l2=(points[3].x-points[0].x)*(points[3].x-points[0].x)+(points[3].y-points[0].y)*(points[3].y-points[0].y);
            if(l1==l2){
                System.out.println("It's a square");
                return;
            }
        }
        System.out.println("Not a square");
    }
}
class point{
    int x;
    int y;
}

有其它问题可以在评论区交流。

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值