• HDU 1086 You can Solve a Geometry Problem too


    计算几何基础问题,具体可以参考算法导论p577,确定两个线段是否相交

     1 #include <iostream>
     2 #include <vector>
     3 #include <algorithm>
     4 
     5 using namespace std;
     6 
     7 struct point{
     8     double x,y;
     9 };
    10 
    11 struct segment{
    12     point p1,p2;
    13 };
    14 
    15 double direction(point p1, point p2, point p3){
    16     return (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x);
    17 }
    18 
    19 bool on_segment(point p1, point p2, point p3){
    20     if( min(p1.x,p2.x) <= p3.x && p3.x <= max(p1.x,p2.x) && min(p1.y,p2.y) <= p3.y && p3.y <= max(p1.y,p2.y) )
    21         return true;
    22     else return false;
    23 }
    24 
    25 bool segment_intersect(point p1,point p2,point p3,point p4){
    26     double d1 = direction(p3,p4,p1);
    27     double d2 = direction(p3,p4,p2);
    28     double d3 = direction(p1,p2,p3);
    29     double d4 = direction(p1,p2,p4);
    30     if( d1*d2 <0 && d3*d4 < 0) return true;
    31     else if(d1 == 0 && on_segment(p3,p4,p1)) return true;
    32     else if(d2 == 0 && on_segment(p3,p4,p2)) return true;
    33     else if(d3 == 0 && on_segment(p1,p2,p3)) return true;
    34     else if(d4 == 0 && on_segment(p1,p2,p4)) return true;
    35     else return false;
    36 }
    37 
    38 int main(){
    39     int N;
    40     while(cin >>N && N){
    41         vector<segment> seg(N);
    42         for(int i = 0; i < N; i ++ )
    43             cin >> seg[i].p1.x>>seg[i].p1.y>>seg[i].p2.x>>seg[i].p2.y;
    44         int cnt  = 0;
    45         for(int i = 0 ; i < N; i ++ ){
    46             for(int j = i+1; j < N; j ++ ){
    47                 if(segment_intersect(seg[i].p1,seg[i].p2,seg[j].p1,seg[j].p2)) cnt++;
    48             }
    49         }
    50         cout<< cnt<<endl;
    51     }
    52     return 0;
    53 }
  • 相关阅读:
    Python 学习笔记(七)Python字符串(三)
    Python 学习笔记(七)Python字符串(二)
    Python 学习笔记(六)Python第一个程序
    Python 学习笔记(五)常用函数
    Python 学习笔记(四)数字(二)
    行为型模式之责任链模式
    python_frm组件
    django之models学习总结
    HTTP协议
    事件委托
  • 原文地址:https://www.cnblogs.com/xiongqiangcs/p/3012363.html
Copyright © 2020-2023  润新知