Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
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
Archives
Today
Total
관리 메뉴

dh-winternagi 님의 블로그

(20149) 선분 교차 3 본문

백준 (C++)/Solve

(20149) 선분 교차 3

dh-winternagi 2026. 4. 22. 01:53

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

단계별로 풀어보기

39단계(기하 2) 6번째

 

 

 

선분 교차 2에서 좌표까지 구해야 하는 문제

양 끝점의 좌표를 아는 선분은 함수로 표현할 수 있으므로 연립방정식을 세워 풀면 교점의 좌표를 구할 수 있다.

마찬가지로 네 점의 좌표가 일직선 위에 있을 때가 문제인데, 한 선분의 큰 값의 점이 다른 선분의 작은 값의 점과 일치한다면 그 점이 유일한 교점이고 아니라면 선분이 겹치는 것이므로 생략한다.

 

 

 

#include <iostream>
using namespace std;

struct Cord{
  long x;
  long y;
  
  Cord(): x(0), y(0) {}
  Cord(long x0, long y0): x(x0), y(y0) {}
  
  bool operator <(const Cord& other) const{
    return make_pair(x,y)<make_pair(other.x,other.y);
  }
  bool operator <=(const Cord& other) const{
    return make_pair(x,y)<=make_pair(other.x,other.y);
  }
  bool operator ==(const Cord& other) const{
    return make_pair(x,y)==make_pair(other.x,other.y);
  }
};

int main() {
  cout << fixed;
  cout.precision(9);
  
  Cord p[4];
  
  for(int i=0;i<4;i++)  cin >> p[i].x >> p[i].y;
  
  auto ccw= [](Cord &p1, Cord &p2, Cord &p3){
    long t= (p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y);
    
    if(t>0)  return 1;
    else if(t<0)  return -1;
    else  return 0;
  };
  
  auto iscross= [&ccw](Cord &p1, Cord &p2, Cord &p3, Cord &p4){
    long a= ccw(p1,p2,p3)*ccw(p1,p2,p4);
    long b= ccw(p4,p3,p1)*ccw(p4,p3,p2);
    
    if(a==0 && b==0){
      if(p2<p1)  swap(p2, p1);
      if(p4<p3)  swap(p4, p3);
      
      if(p1<=p4 && p3<=p2){
        return true;
      }else{
        return false;
      }
    }else if(a<=0&&b<=0){
      return true;
    }else{
      return false;
    }
  };
  
  auto intersection= [](Cord &p1, Cord &p2, Cord &p3, Cord &p4){
    long px= (p1.x*p2.y-p1.y*p2.x)*(p3.x-p4.x)-(p1.x-p2.x)*(p3.x*p4.y-p3.y*p4.x);
    long py= (p1.x*p2.y-p1.y*p2.x)*(p3.y-p4.y)-(p1.y-p2.y)*(p3.x*p4.y-p3.y*p4.x);
    long pd= (p1.x-p2.x)*(p3.y-p4.y)-(p1.y-p2.y)*(p3.x-p4.x);
    
    if(!pd){
      if(p1==p4)  cout << p1.x << " " << p1.y;
      else if(p2==p3)  cout << p2.x << " " << p2.y;
    }else{
      cout << 1.0*px/pd << " " << 1.0*py/pd;
    }
  };
  
  if(iscross(p[0], p[1], p[2], p[3])){
    cout << "1\n";
    intersection(p[0], p[1], p[2], p[3]);
  }else{
    cout << "0\n";
  }
  
  return 0;
}

'백준 (C++) > Solve' 카테고리의 다른 글

(1688) 지민이의 테러  (0) 2026.04.22
(2162) 선분 그룹  (0) 2026.04.22
(17387) 선분 교차 2  (0) 2026.04.22
(17386) 선분 교차 1  (0) 2026.04.22
(25308) 방사형 그래프  (0) 2026.04.22