POJ 3304 Segments | 线段相交

#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 105
#define eps 1e-8
using namespace std;
double abs (double x)
{
    return x>0?x:-x;
}
bool dcmp(double x,double y)
{
    if (abs(x-y)<eps) return 1;
    return 0;
}
struct point
{
    double x,y;
    point () {};
    point (double _x,double _y) :
	x(_x),y(_y) {};
    /*
    point operator - (const point &a) const
	{
	    return point (x-a.x,y-a.y);
	}
    double operator * (const point &rhs) const
	{
	    return x*rhs.y-rhs.x*y;
	}
    */
    bool operator < (const point &rhs) const
	{
	    return x<rhs.x;
	}
    friend point operator + (const point &a,const point &b) {
	return point(a.x+b.x,a.y+b.y);
    }
    friend point operator - (const point &a,const point &b) {
	return point(a.x-b.x,a.y-b.y);
    }
    friend double operator * (const point &a,const point &b) {
	return a.x*b.y-a.y*b.x;
    }
    bool operator == (const point &rhs) const
	{
	    return dcmp(x,rhs.x) && dcmp(y,rhs.y);
	}
};
struct line
{
    point a,b;
}seg[N];
int T,n;
bool check (point l,point z)
{
    if (l==z) return 0;
    for (int i=1;i<=n;i++)
	 if(((l-seg[i].a)*(l-z)) *((l-seg[i].b)*(l-z)) > eps) return 0;
    return 1;
}
void solve()
{
    	scanf("%d",&n);
	for (int i=1;i<=n;i++)
	    scanf("%lf%lf%lf%lf",&seg[i].a.x,&seg[i].a.y,&seg[i].b.x,&seg[i].b.y);
	if (n<3)
	{
	    puts("Yes!");
	    return ;
	}
	for (int i=1;i<=n;i++)
	{
	    for (int j=i+1;j<=n;j++)
		if ( check(seg[i].a,seg[j].b) ||
		     check(seg[i].b,seg[j].a) ||
		     check(seg[i].a,seg[j].a) ||
		     check(seg[i].b,seg[j].b))
		{
		    puts("Yes!");
		    return ;
		}
	}
	puts("No!");
}
int main()
{
    scanf("%d",&T);
    while (T--)
    {
	solve();
    }
    return 0;
}
原文地址:https://www.cnblogs.com/mrsheep/p/8005761.html