article thumbnail image
Published 2021. 6. 30. 20:11

문제 설명

풀이

선분의 교차는 ccw의 값으로 구한다. ccw를 모른다면 여기를 참고하자.

직선이 교차하는 경우

직선이 교차하기 위해서는 abc abd의 ccw값의 부호가 다르고, cda cdb의 값의 부호도 달라야한다.

직선이 겹치는 경우는 항상 a <= d && c <= b 가 성립된다.

 

코드

#include <cstdio>
#include <utility>
#define x first
#define y second

using namespace std;
using ll = long long;
using pll = pair<ll, ll>;

ll ccw(pll a, pll b, pll c) {
    ll ans =  (a.x * b.y + b.x * c.y + c.x * a.y) - (a.y * b.x + b.y * c.x + c.y * a.x);
    if (ans > 0) return 1;
    else if (ans < 0) return -1;
    else return 0; 
}

bool check(pll a, pll b, pll c, pll d) {
    ll abc = ccw(a, b, c);
    ll abd = ccw(a, b, d);
    ll cda = ccw(c, d, a);
    ll 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() {
    pll input[4];
    for (int i = 0; i < 4; i++)
        scanf("%lld %lld", &input[i].x, &input[i].y);
    if (check(input[0], input[1], input[2], input[3])) printf("1");
    else printf("0");
}

문제 링크 : https://www.acmicpc.net/problem/17387

'Algorithm > BOJ' 카테고리의 다른 글

백준[7869] 두 원  (0) 2021.06.30
백준[2162] 선분 그룹  (0) 2021.06.30
백준[20149] 선분 교차 3  (0) 2021.06.29
백준[1949] 우수마을  (0) 2021.06.29
백준[2533] 사회망 서비스(SNS)  (0) 2021.06.24
복사했습니다!