728x90
반응형
1. 문제
https://www.acmicpc.net/problem/17387
2. 알고리즘 분류
- 기하학
- 많은 조건 분기
- 선분 교차 판정
3. 소스 코드
#include <iostream>
#include <algorithm>
using namespace std;
pair<long long, long long> A;
pair<long long, long long> B;
pair<long long, long long> C;
pair<long long, long long> D;
// CCW(Counter ClockWise) 알고리즘
int ccw(pair<long long, long long> p1, pair<long long, long long> p2, pair<long long, long long> p3)
{
// 외적 계산
long long temp = p1.first * p2.second + p2.first * p3.second + p3.first * p1.second;
temp -= p1.second * p2.first + p2.second * p3.first + p3.second * p1.first;
if (temp > 0) return 1; // 반시계 방향
else if (temp == 0) return 0; // 일직선
else return -1; // 시계 방향
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int ret = 0;
cin >> A.first >> A.second;
cin >> B.first >> B.second;
cin >> C.first >> C.second;
cin >> D.first >> D.second;
if (A > B) swap(A, B);
if (C > D) swap(C, D);
int ans1 = ccw(A, B, C) * ccw(A, B, D);
int ans2 = ccw(C, D, A) * ccw(C, D, B);
if (ans1 == 0 && ans2 == 0) {
// 두 직선이 겹칠 때,
if (A <= D && B >= C)
ret = 1;
}
else {
// 두 직선이 교차할 때,
if (ans1 <= 0 && ans2 <= 0)
ret = 1;
}
cout << ret;
return 0;
}
4. 유용한 알고리즘
1) CCW (Counter ClockWise) 알고리즘
1. 세 점의 방향관계를 알 수 있는 알고리즘
728x90
'백준 알고리즘 > 백준 CLASS 5' 카테고리의 다른 글
[백준 C++] 1509번: 팰린드롬 분할 (0) | 2024.05.04 |
---|---|
[백준 C++] 1208번: 부분수열의 합 2 (1) | 2024.05.01 |
[백준 C++] 16946번: 벽 부수고 이동하기 4 (1) | 2024.04.14 |
[백준 C++] 12015번: 가장 긴 증가하는 부분 수열 2 (0) | 2024.04.14 |
[백준 C++] 10775번: 공항 (0) | 2024.04.14 |