题解
判断正方形有多种方式,本题写程序适合使用如下判定定理:
对角线相等的菱形是正方形。
对于正方形,对角线的长度是边长的根号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;
}