https://www.acmicpc.net/problem/1485
네 점이 주어질 때 정사각형인지 판별하면 된다.
네 점이 어떤 순으로 정렬되어서 들어온다는 보장이 없기 때문에, 사용하기 편하게 정렬을 해줘야 한다.
본인은 x좌표 오름차순으로 우선 정렬하고, x좌표가 같은 경우에 y좌표 오름차순으로 정렬했다.
따라서
p2 p3
p0 p1
이런식으로 정렬되게 된다. 이후에는 거리를 구해줘야 하는데, 거리를 구할 때 동일한지 여부만 비교하면 되기 때문에, 오차 방지를 위해서
루트를 씌우지 않고 거리를 구했다. 즉 거리의 제곱을 활용해서 거리 비교를 했다.
거리의 제곱이 같아도, 거리는 같은 것이기 때문이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include<iostream> #include<algorithm> using namespace std; typedef long long ll; struct PT { int x, y; }; PT p[4]; int dis[4][4]; bool cmp(PT a, PT b) { //x좌표 기준 오름차순. x좌표 같으면 y좌표 오름차순 if (a.x < b.x) return true; else if (a.x == b.x) { if (a.y < b.y) return true; else return false; } else return false; } ll distSquare(PT a, PT b) { //오차 방지를 위해 루트 생략(비교만 하면 되니까) return (a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y); } int main(void) { int n; cin >> n; while (n--) { for (int i = 0; i < 4; i++) { cin >> p[i].x >> p[i].y; } sort(p, p + 4, cmp); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (i == j) continue; //같으면 거리 0 dis[i][j] = distSquare(p[i], p[j]); } } if (dis[0][1] == dis[0][2] && dis[3][2] == dis[3][1] && dis[0][3] == dis[1][2]) //네변 길이 같고, 대각선 길이 같으면 cout << 1 << '\n'; else cout << 0 << '\n'; } return 0; } | cs |
'알고리즘 문제 풀이 > 백준 온라인 저지' 카테고리의 다른 글
백준 1708 볼록 껍질 C++ (0) | 2019.08.12 |
---|---|
백준 10255 교차점 C++ (0) | 2019.08.11 |
백준 6439 교차 C++ (0) | 2019.08.11 |
백준 2162: 선분 그룹 C++ (0) | 2019.08.11 |
백준 2166 다각형의 면적 C++ (0) | 2019.08.10 |