原题链接:它是正方形吗
题目描述
思路
难度不大,但以下进行了比较深的分析,有助于解决其它同类型的题目
方法一:
枚举所有排列,共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;
}
有其它问题可以在评论区交流。