给定四个点,判断能否组成正方形
求出任意两点之间的六条边后,从小到大排序。
如果前四条边相等,后两条边相等,且后两条边的长度大于前四条边边,则可以组成正方形。
例题: 牛客 Forsaken喜欢正方形
题目描述
Forsaken特别喜欢正方形,现在他有二维平面的四个整点。如果四个整点可以直接形成一个正方形,输出"wen"。如果可以通过对其中一个点进行一次轻微的调整使得四个整点形成一个正方形,输出“hai xing”,轻微的调整是指如果当前整点坐标为(x,y)(x,y),那么我们可以把这个点变成(x+1,y),(x-1,y),(x,y+1),(x,y-1)(x+1,y),(x−1,y),(x,y+1),(x,y−1)中的一种。否则如果都不行,输出“wo jue de bu xing”。
输入描述:
输入有四行,每行一个二维坐标(x,y)(x,y)
输出描述:
按题面给定输出。
备注:
0 <= x,y <= 100
AC代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <math.h> 5 #include <algorithm> 6 #include <queue> 7 #include <stack> 8 #include <deque> 9 #include <iostream> 10 using namespace std; 11 typedef long long LL; 12 const int N = 30000009; 13 14 int x[5], y[5], x2[5], y2[5]; 15 int way[] = {0, 0, 0, 1, 0, -1, 1, 0, -1, 0}; 16 int edge[10]; 17 18 int dis(int a1, int b1, int a2, int b2) 19 { 20 return (a2 - a1) * (a2 - a1) + (b2 - b1) * (b2 - b1); 21 } 22 23 int main() 24 { 25 int i, j, n, t; 26 int a, b, c, d, cnt, flag = 0; 27 for (i = 1; i <= 4; i++) 28 { 29 scanf("%d%d", &x2[i], &y2[i]); 30 } 31 32 for (a = 0; a < 10; a += 2) 33 { 34 for (b = 0; b < 10; b += 2) 35 { 36 for (c = 0; c < 10; c += 2) 37 { 38 for (d = 0; d < 10; d += 2) 39 { 40 x[1] = x2[1] + way[a]; 41 y[1] = y2[1] + way[a + 1]; 42 43 x[2] = x2[2] + way[b]; 44 y[2] = y2[2] + way[b + 1]; 45 46 x[3] = x2[3] + way[c]; 47 y[3] = y2[3] + way[c + 1]; 48 49 x[4] = x2[4] + way[d]; 50 y[4] = y2[4] + way[d + 1]; 51 52 cnt = 1; 53 for (i = 1; i <= 4; i++) 54 { 55 for (j = i + 1; j <= 4; j++) 56 { 57 edge[cnt++] = dis(x[i], y[i], x[j], y[j]); 58 } 59 } 60 sort(edge + 1, edge + 1 + 6); 61 62 if (edge[1] == edge[2] && edge[2] == edge[3] && edge[3] == edge[4] && edge[5] == edge[6] && edge[1] < edge[5]) 63 { 64 65 if (a == 0 && b == 0 && c == 0 && d == 0) 66 { 67 printf("wen\n"); 68 return 0; 69 } 70 else 71 { 72 printf("hai xing\n"); 73 return 0; 74 } 75 } 76 } 77 } 78 } 79 } 80 81 printf("wo jue de bu xing\n"); 82 83 return 0; 84 }