백준

백준 1485 정사각형

콩순이냉장고 2021. 7. 2. 14:20

문제 URL : https://www.acmicpc.net/problem/1485

 

1485번: 정사각형

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 네 줄로 이루어져 있으며, 점의 좌표가 한 줄에 하나씩 주어진다. 점의 좌표는 -100,000보다 크거나 같고, 100,000보다 작거나 같

www.acmicpc.net

 

문제 접근법

  • 4점을 정렬하면 아래 그림과같은 사각형의 순서가 나옵니다. A~D 점으로 

 

 

  • 그후 4개의 모든선이 길이가 같아야겠죠? 정사각형이니까 
  • 마지막으로 길이가 같다고 정사각형은 아닙니다. 각도또한 90도인지 확인하기위해 피타고라스 공식을 이용하여
  • AD^2 = AB^2+BD^2 인지 확인하고 CB의 길이도 마찬가지입니다.

소스코드 : 

 

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
47
48
49
#include <bits/stdc++.h>
using namespace std;
#define ll long long
vector<pair<ll, ll>> v;
void init() {
    v.clear();
}
void input() {
    v.resize(4);
    for (int i = 0; i < 4; i++)
        cin >> v[i].first >> v[i].second;
}
 
ll length(ll x1, ll y1, ll x2, ll y2) { return pow(x1 - x2, 2+ pow(y1 - y2, 2); }
bool check() {
    ll row1 = length(v[0].first, v[0].second, v[1].first, v[1].second);
    ll col1 = length(v[0].first, v[0].second, v[2].first, v[2].second);
    ll row2 = length(v[2].first, v[2].second, v[3].first, v[3].second);
    ll col2 = length(v[3].first, v[3].second, v[1].first, v[1].second);
    
    ll diagona1 = length(v[1].first, v[1].second, v[2].first, v[2].second);
    ll diagonal2 = length(v[0].first, v[0].second, v[3].first, v[3].second);
 
    return row1 == row2 && row1 == col1 && row1 == col2 && (row1 + col1) == diagona1 && (row1 + col2) == diagonal2;
 
 
}
 
void solve() {
    int x, y;
    sort(v.begin(), v.end());
    cout << check() << "\n";
}
 
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    //freopen("input.txt", "r", stdin);
    int test;
    cin >> test;
    while (test--) {
        init();
        input();
        solve();
    }
    return 0;
}
cs

 

 

궁금한점 혹은 모르는점 댓글은 언제든지 환영입니다.