풀이
hypot(a, b)는 a와 b를 높이, 너비로 하는 빗변의 길이를 구해주는 함수이다.
평행사변형이 만들어질 수 없는 경우를 찾아보자.
둘 이상의 점이 겹치거나, 세 점이 한 직선 위에 있으면 (= 기울기가 같으면) 사각형이 될 수 없다.
ccw에서 기울기를 구하는 식을 가져다 쓰자!
여기에 개꿀개꿀 공식이 써있으니 참고하자!
둘 이상의 점이 겹치는 경우도 한 직선 위에 있는 경우이므로 별개로 처리해줄 필요는 없다. (개꿀!)
이제 평행사변형의 둘레의 길이를 찾아보자.
먼저, 남아있는 하나의 점을 찾을 필요가 없음을 알아야한다.
평행사변형은 마주한 두 변의 길이가 같으므로, 주어진 세 점의 좌표만으로 둘레를 구할 수 있다.
여기까지만 눈채챘다면 (아마 조금 더럽고 길게) 구현이 가능할 것이다.
여기서 평행사변형 구성이 가능한 모든 경우에, 최대 둘레와 최소 둘레에 겹치는 변이 존재함을 알 수 있다.
따라서 복잡하게 계산할 필요 없이 a, b, c로 만들 수 있는 빗변만 모두 구해서 계산해주면 된다.
코드
#include <stdio.h>
#include <algorithm>
using namespace std;
int ax, ay, bx, by, cx, cy;
int main() {
scanf("%d %d %d %d %d %d", &ax, &ay, &bx, &by, &cx, &cy);
double a = hypot(bx-cx,by-cy), b = hypot(cx-ax,cy-ay), c = hypot(ax-bx,ay-by);
if ((bx-ax)*(cy-ay) == (by-ay)*(cx-ax)) puts("-1");
else printf("%.10lf", (max(a,max(b,c)) - min(a,min(b,c))) * 2);
return 0;
}
아무말
백준, 백준 온라인 저지, BOJ, Baekjoon Online Judge