"BOJ 17387 선분 교차 2"의 두 판 사이의 차이

 
(같은 사용자의 중간 판 하나는 보이지 않습니다)
5번째 줄: 5번째 줄:
| 분류2 = 선분 교차 판정
| 분류2 = 선분 교차 판정
}}
}}
==같이 보기==
* [[BOJ 17386 선분 교차 1]]
* [[BOJ 17387 선분 교차 2]]
* [[BOJ 20149 선분 교차 3]]
* [[BOJ 20150 선분 교차 4]]
* [[BOJ 20151 선분 교차 5]]
* [[BOJ 27718 선분 교차 EX]]


==C++==
==C++==
14번째 줄: 22번째 줄:
     long long x, y;
     long long x, y;
     bool operator<=(Point const &p1) {
     bool operator<=(Point const &p1) {
         if(x == p1.x){
         if(x == p1.x) {
             return y <= p1.y;
             return y <= p1.y;
         }
         }
20번째 줄: 28번째 줄:
     }
     }
};
};
struct Line {
Point p1, p2, p3, p4;
    Point p1;
 
    Point p2;
int ccw(const Point &a, const Point &b, const Point &c) {
};
     long long res = (a.x*b.y + b.x*c.y + c.x*a.y) - (b.x*a.y + c.x*b.y + a.x*c.y);
Line line[2];
int ccw(const Point &p1, const Point &p2, const Point &p3){
     long long res = (p1.x*p2.y + p2.x*p3.y + p3.x*p1.y) - (p2.x*p1.y + p3.x*p2.y + p1.x*p3.y);
     if(res > 0) return 1;
     if(res > 0) return 1;
     if(res < 0) return -1;
     if(res < 0) return -1;
33번째 줄: 37번째 줄:
}
}
   
   
bool intersect(Line& l1, Line &l2){
bool intersect() {
     int std1 = ccw(l1.p1, l1.p2, l2.p1) * ccw(l1.p1, l1.p2, l2.p2);
     int std1 = ccw(p1, p2, p3) * ccw(p1, p2, p4);
     int std2 = ccw(l2.p1, l2.p2, l1.p1) * ccw(l2.p1, l2.p2, l1.p2);
     int std2 = ccw(p3, p4, p1) * ccw(p3, p4, p2);
     if(std1 <= 0 && std2 <= 0) {
     if(std1 <= 0 && std2 <= 0) {
         if(std1 == 0 && std2 == 0) {
         if(std1 == 0 && std2 == 0) {
             if(l1.p2 <= l1.p1) swap(l1.p1, l1.p2);
             if(p2 <= p1) swap(p1, p2);
             if(l2.p2 <= l2.p1) swap(l2.p1, l2.p2);
             if(p4 <= p3) swap(p3, p4);
             return l1.p1 <= l2.p2 && l2.p1 <= l1.p2;
             return p1 <= p4 && p3 <= p2;
         }
         }
         return true;
         return true;
48번째 줄: 52번째 줄:
   
   
void solve(){
void solve(){
     if(intersect(line[0], line[1])) {
     if(intersect()) {
         cout << 1;
         cout << 1;
     } else {
     } else {
56번째 줄: 60번째 줄:
   
   
int main(){
int main(){
     Point p1, p2;
     cin >> p1.x >> p1.y;
    for(int i = 0 ; i < 2; i++){
    cin >> p2.x >> p2.y;
        cin >> p1.x >> p1.y >> p2.x >> p2.y;
    cin >> p3.x >> p3.y;
        line[i].p1 = p1;
    cin >> p4.x >> p4.y;
        line[i].p2 = p2;
    }
     solve();
     solve();
}
}
</syntaxhighlight>
</syntaxhighlight>

2024년 1월 13일 (토) 12:41 기준 최신판

1 개요[ | ]

BOJ 17387 선분 교차 2

2 같이 보기[ | ]

3 C++[ | ]

#include <bits/stdc++.h>
using namespace std;
 
struct Point {
    long long x, y;
    bool operator<=(Point const &p1) {
        if(x == p1.x) {
            return y <= p1.y;
        }
        return x <= p1.x;
    }
};
Point p1, p2, p3, p4;

int ccw(const Point &a, const Point &b, const Point &c) {
    long long res = (a.x*b.y + b.x*c.y + c.x*a.y) - (b.x*a.y + c.x*b.y + a.x*c.y);
    if(res > 0) return 1;
    if(res < 0) return -1;
    return 0;
}
 
bool intersect() {
    int std1 = ccw(p1, p2, p3) * ccw(p1, p2, p4);
    int std2 = ccw(p3, p4, p1) * ccw(p3, p4, p2);
    if(std1 <= 0 && std2 <= 0) {
        if(std1 == 0 && std2 == 0) {
            if(p2 <= p1) swap(p1, p2);
            if(p4 <= p3) swap(p3, p4);
            return p1 <= p4 && p3 <= p2;
        }
        return true;
    }
    return false;
}
 
void solve(){
    if(intersect()) {
        cout << 1;
    } else {
        cout << 0;
    }
}
 
int main(){
    cin >> p1.x >> p1.y;
    cin >> p2.x >> p2.y;
    cin >> p3.x >> p3.y;
    cin >> p4.x >> p4.y;
    solve();
}
문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}