http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=5068
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <cstring>
using namespace std;
#define MIN(x,y)(x<y?x:y)
#define MAX(x,y)(x>y?x:y)
#define esp 1e-8
struct point
{
double x,y;
}a[120],c[120];
int T;
int b[110];
double len_x(point p1,point p2)
{
return sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y));
}
int bd(point p1,point p2,point p3,point p4)
{
point tp1,tp2,tp3;
point tp11,tp21,tp31;
int a1,b1,a2,b2;
int a3,a4,b3,b4;
tp1.x=p1.x-p3.x;
tp1.y=p1.y-p3.y;
tp2.x=p4.x-p3.x;
tp2.y=p4.y-p3.y;
tp3.x=p2.x-p3.x;
tp3.y=p2.y-p3.y;
tp11.x=p4.x-p2.x;
tp11.y=p4.y-p2.y;
tp21.x=p1.x-p2.x;
tp21.y=p1.y-p2.y;
tp31.x=p3.x-p2.x;
tp31.y=p3.y-p2.y;
if((p1.x==p3.x&&p1.y==p3.y)||(p1.x==p4.x&&p1.y==p4.y)||(p2.x==p3.x&&p2.y==p3.y)||(p2.x==p4.x&&p2.y==p4.y))
return 1;
// 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))||(MIN(p1.x,p2.x)<=p4.x&&p4.x<=MAX(p1.x,p2.x)&&MIN(p1.y,p2.y)<=p4.y&&p4.y<=MAX(p1.y,p2.y)))
// ;
// else return 0;
if((tp1.x*tp2.y-tp1.y*tp2.x)*(tp2.x*tp3.y-tp2.y*tp3.x)>=0&&(tp11.x*tp21.y-tp11.y*tp21.x)*(tp21.x*tp31.y-tp21.y*tp31.x)>=0)
{
if((tp1.x*tp2.y-tp1.y*tp2.x)*(tp2.x*tp3.y-tp2.y*tp3.x)==0&&(tp11.x*tp21.y-tp11.y*tp21.x)*(tp21.x*tp31.y-tp21.y*tp31.x)==0)
{
if(p1.x!=p2.x)
{
a1=MIN(p1.x,p2.x);
a2=MAX(p1.x,p2.x);
b1=MIN(p3.x,p4.x);
b2=MAX(p3.x,p4.x);
if(a1>b2||a2<b1)
return 0;
else
return 1;
}
else
{
a1=MIN(p1.y,p2.y);
a2=MAX(p1.y,p2.y);
b1=MIN(p3.y,p4.y);
b2=MAX(p3.y,p4.y);
if(a1>b2||a2<b1)
return 0;
else
return 1;
}
}
else
return 1;
}
return 0;
}
void dfs(int m)
{
for(int i=0;i<T;i++)
{
if(b[i]&&bd(a[m],c[m],a[i],c[i]))
{
b[i]=0;
//printf("%d %d\n",m,i);
dfs(i);
}
}
}
int main()
{
int n,m,i;
while(~scanf("%d",&T))
{
for(i=0;i<T;i++)
scanf("%lf%lf%lf%lf",&a[i].x,&a[i].y,&c[i].x,&c[i].y);
int sum=0;
memset(b,1,sizeof(b));
for(i=0;i<T;i++)
{
if(b[i])
{
// printf("%d\n",i);
b[i]=0;
dfs(i);
sum++;
}
}
//printf("%d.\n",bd(a[4],c[4],a[3],c[3]));
printf("%d\n",sum);
}
}