您的位置:首页 > 其它

HDU 1086 You can Solve a Geometry Problem too(求线段交点数)

2013-11-07 18:46 495 查看
好长时间没有写博客了,来一道水题练练手。

/************************************
 * Author : binwin20                *
 * Blog   : blog.csdn.net/binwin20  *
 ************************************/
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <queue>
#include <map>
#include <stack>
#include <string>
#include <algorithm>
#include <vector>
#include <list>
#include <deque>

#define LL long long
#define DB double
#define SI(a) scanf("%d",&a)
#define SD(a) scanf("%lf",&a)
#define SS(a) scanf("%s",a)
#define PF printf
#define MM(a,b) memset(a,b,sizeof(a))
#define REP(i,a,b) for(int i=a;i<b;i++) 
#define REPD(i,a,b) for(int i=a;i>b;i--)
#define INF 0x3f3f3f3f
#define EPS 1e-8
#define bug puts("bug")
using namespace std;
#define N 109
struct cpoint{
    DB x,y;
    void get(){
        SD(x);SD(y);
    }
};
DB x_mult(cpoint a,cpoint b,cpoint p){
    return (a.x-p.x)*(b.y-p.y)-(a.y-p.y)*(b.x-p.x);
}
struct csegment{
    cpoint st,en;
    csegment(){}
    csegment(cpoint a,cpoint b){
        st = a;en = b;
    }
};
bool online(cpoint p1,cpoint p2,cpoint p3,cpoint p4){
    if(max(p1.x,p2.x)<min(p3.x,p4.x)||max(p1.y,p2.y)<min(p3.y,p4.y)||
            max(p3.x,p4.x)<min(p1.x,p2.x)||max(p3.y,p4.y)<min(p1.y,p2.y))
        return false;
    return true;
}
bool across_seg(csegment a,csegment b){
    if(online(a.st,a.en,b.st,b.en)&&
            x_mult(b.st,a.en,a.st)*x_mult(a.en,b.en,a.st)>-EPS&&
            x_mult(a.st,b.en,b.st)*x_mult(b.en,a.en,b.st)>-EPS)
        return true;
    return false;
}
csegment re
;
int n;
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    #endif
    while(~SI(n)&&n){
        REP(i,0,n){
            re[i].st.get();
            re[i].en.get();
        }
        int ans = 0;
        REP(i,0,n)
            REP(j,i+1,n){
                if(across_seg(re[i],re[j])) ans++;
            }
        PF("%d\n",ans);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: