题解

正方形检测

判断正方形有多种方式,本题写程序适合使用如下判定定理:

对角线相等的菱形是正方形。

对于正方形,对角线的长度是边长的根号2倍。

连接正方形的所有顶点,可知,有四条边相等,两条对角线相等且等于边长的根号2倍,故本题可转化为求从4个点,两两连线,求出该6条线的长度,然后判断是否可以构成正方形:只需排序后检查前4条边是否都相等,且后两条边相等且等于边长的根号2倍。代码如下:

#include <cstdio>
#include <algorithm>
using namespace std;
int x[4],y[4];
bool judge(){
    int edges[6];
    edges[0] = (x[0] - x[1]) * (x[0] - x[1]) + (y[0] - y[1]) * (y[0] - y[1]);
    edges[1] = (x[0] - x[2]) * (x[0] - x[2]) + (y[0] - y[2]) * (y[0] - y[2]);
    edges[2] = (x[0] - x[3]) * (x[0] - x[3]) + (y[0] - y[3]) * (y[0] - y[3]);
    edges[3] = (x[1] - x[2]) * (x[1] - x[2]) + (y[1] - y[2]) * (y[1] - y[2]);
    edges[4] = (x[1] - x[3]) * (x[1] - x[3]) + (y[1] - y[3]) * (y[1] - y[3]);
    edges[5] = (x[2] - x[3]) * (x[2] - x[3]) + (y[2] - y[3]) * (y[2] - y[3]);
    sort(edges,edges+6);
    if(edges[0] == edges[1] && edges[1] == edges[2] && edges[2] == edges[3] &&edges[4] == edges[5] && 2* edges[0] ==edges[5] )
        return true;
    return false;
}
int main(){
    for(int i = 0; i < 4; i++)scanf("%d",&x[i]);
    for(int i = 0; i < 4; i++)scanf("%d",&y[i]);
    if(judge())printf("It's a square\n");
    else printf("Not a square");
    return 0;
}

全部评论
666
点赞
送花
回复
分享
发布于 05-09 11:20 广东

相关推荐

祈求顺利毕业😁:简历很好了,多投吧牛油😂。主要是环境不好,大家也卷
点赞 评论 收藏
转发
1 1 评论
分享
牛客网
牛客企业服务