백준문제풀이

백준 문제 17386번 선분 교차 1 문제풀이 c++

노가다 김씨 2022. 3. 13. 09:54

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

 

17386번: 선분 교차 1

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

www.acmicpc.net

 

문제 해석

 

4개점을 p1,p2,p3,p4라고 하자. 그리고 방향은 시계방향 , 반시계 방향, 일직선방향이 있다고 하자. 

 

두 선분이 교차하기위해서는 p1,p2,p3를 이은 선분과 p1,p2,p4를 이은 선분이 서로 다른 방향을 향해야하고 이를 만족한상태에서 p3,p4,p1를 이은 선분과 p3,p4,p2를 이은 선분의 방향이 다른 방향을 향하고 있다면 두 선분은 교차하고 있으므로 1을 출력하고 그 외에는 교차하지않으므로 0을 출력하면된다.

 

저번 게시글에서 작성한 ccw를 그대로 가져와서 작성하였다.

 

 

코드

 

#include <iostream>
#include <algorithm>
typedef long long int ll;
using namespace std;
ll ccw(ll x1,ll x2,ll x3,ll y1,ll y2,ll y3);
int main(){
    cout.tie(NULL);
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
    ll x[4];
    ll y[4];
    for(ll i=0; i<4; i++)
    {
        cin>>x[i]>>y[i];
    }
    ll a=ccw(x[0],x[1],x[2],y[0],y[1],y[2]);
    ll b=ccw(x[0],x[1],x[3],y[0],y[1],y[3]);
    ll c=ccw(x[2],x[3],x[0],y[2],y[3],y[0]);
    ll d=ccw(x[2],x[3],x[1],y[2],y[3],y[1]);
    if((a==1&&b==-1)||(a==-1&&b==1))
    {
        if((c==1&&d==-1||(c==-1&&d==1)))
        {
            cout<<1;
        }
        else
        {
            cout<<0;
        }
    }
    else
    {
        cout<<0;
    }

}
ll ccw(ll x1,ll x2,ll x3,ll y1,ll y2,ll y3){
    if(x1==x2)
    {
        if(x3>x1)
        {
            return -1;
        }
        else if(x3<x1)
        {
            return 1;
        }
    }
    else if(x1==x3)
    {
        if(y3<y1)
        {
            return -1;
        }
        else if(y3>y1)
        {
            return 1;
        }
    }
    else
    {
        ll a=(x1-x3)*(y1-y2);
        ll b=(x1-x2)*(y1-y3);
        if(a<b)
        {
            return 1;
        }
        else if(a>b)
        {
            return -1;
        }
    }
    return 0;
}