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