17386번 : 선분 교차 1 /C++

2023. 6. 18. 12:54개인공부/코딩테스트

17386번: 선분 교차 1 (acmicpc.net)

 

17386번: 선분 교차 1

첫째 줄에 L1의 양 끝 점 x1, y1, x2, y2가, 둘째 줄에 L2의 양 끝 점 x3, y3, x4, y4가 주어진다. 세 점이 일직선 위에 있는 경우는 없다.

www.acmicpc.net


세 점이 일직선 상에 없으므로 판단할때 음수만 판단한다, long long 곱은 역시나 플로우가 발생하므로 조심하자

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
#include <iostream>
 
using namespace std;
 
typedef long long ll;
 
ll CCW(ll x1, ll y1, ll x2, ll y2, ll x3, ll y3)
{
    return (x2 - x1) * (y3 - y1) - (x3 - x1)*(y2 - y1);
}
 
 
int main()
{
    ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
 
    ll x[4], y[4];
    for (int i = 0; i < 4++i)
    {
        cin >> x[i] >> y[i];
    }
 
    // long long 곱으로 오버플로우 발생하므로 양수 음수 판단
    ll c[4= { CCW(x[0], y[0], x[1], y[1], x[2], y[2]),CCW(x[0], y[0], x[1], y[1], x[3], y[3])
        ,CCW(x[2], y[2], x[3], y[3], x[1], y[1]) ,CCW(x[2], y[2], x[3], y[3], x[0], y[0]) };
 
    if ((c[0< 0 && c[1> 0 || c[0> 0 && c[1< 0&& (c[2> 0 && c[3< 0 || c[2< 0 && c[3> 0))
        cout << 1;
    else
        cout << 0;
 
    return 0;
}
 
cs