백준문제풀이
백준 문제 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;
}