기술 블로그

17386번 선분 교차 1, 17387번 선분 교차 2 본문

알고리즘 문제/BOJ

17386번 선분 교차 1, 17387번 선분 교차 2

parkit 2019. 8. 17. 23:44
728x90
반응형

https://www.acmicpc.net/problem/17386


https://www.acmicpc.net/problem/17387







선분 AB와 선분 CD가 교차하려면, 


선분 AB를 기준으로 C와의 방향과 D와의 방향이 서로 달라야 한다.


즉, CCW(A, B, C) * CCW(A, B, D)의 값이 음수여야 한다.


선분 CD의 입장에서 마찬가지이다.


CCW(C, D, A) * CCW(C, D, B)의 값이 음수여야 한다.



즉, CCW(A, B, C) * CCW(A, B, D) <= 0 && CCW(C, D, A) * CCW(C, D, B) <= 0 이면, 

교차한다고는 일단 할 수 있다.


그러나 


CCW(A, B, C) * CCW(A, B, D) == 0 && CCW(C, D, A) * CCW(C, D, B) == 0 인 경우가 있다.









아래 그림을 참고하자.




오른쪽으로 갈 수록 큰 것으로 생각하자.





두 번째 경우를 보면


점 C가 점 B보다 작아야 하며,

점 A가 D보다 작아야 한다. 


코드 27 ~ 30 번째 줄 참고.








두 문제 적용되는 정답 코드이다.

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
#include <bits/stdc++.h>
 
using namespace std;
 
#define ll long long
 
int ccw(pair<ll, ll> p1, pair<ll, ll> p2, pair<ll, ll> p3)
{
    ll temp = p1.first * p2.second + p2.first * p3.second + p3.first * p1.second;
 
    temp = temp - p1.second * p2.first - p2.second * p3.first - p3.second * p1.first;
 
    if (temp > 0return 1// 반시계
    else if (temp == 0return 0// 일직선
    else if (temp < 0return -1// 시계
}
 
bool chk(pair<ll, ll> a, pair<ll, ll> b, pair<ll, ll> c, pair<ll, ll> d)
{
    int abc = ccw(a, b, c);
    int abd = ccw(a, b, d);
    int cda = ccw(c, d, a);
    int cdb = ccw(c, d, b);
 
    if (abc * abd == 0 && cda * cdb == 0)
    {
        if (a > b) swap(a, b);
        if (c > d) swap(c, d);
 
        return a <= d && c <= b;
    }
 
    return abc * abd <= 0 && cda * cdb <= 0;
}
 
int main(void)
{
    pair<ll, ll> xy[4];
 
    for (int i = 0; i < 4; i++)
        scanf("%lld %lld"&xy[i].first, &xy[i].second);
    
    if (chk(xy[0], xy[1], xy[2], xy[3])) printf("1\n");
    else printf("0\n");
 
    return 0;
}
cs




















728x90
반응형

'알고리즘 문제 > BOJ' 카테고리의 다른 글

17250번 은하철도  (0) 2019.08.19
17352번 여러분의 다리가 되어 드리겠습니다!  (0) 2019.08.19
2042번 구간 합 구하기  (0) 2019.08.16
2234번 성곽  (0) 2019.08.15
17259번 선물이 넘쳐흘러  (0) 2019.08.10