题目
思路
又是一道缝合怪。
这道题直接判断线段相交+Floyd传递闭包。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
double x[100010],y[100010],xx[100010],yy[100010],ans;
int n,dis[510][510],qd,zd;
bool kspc(double x,double y,double xx,double yy,double xx1,double yy1,double xx2,double yy2)
{
//1,3,2
if(xx1<=max(x,xx)&&xx1>=min(x,xx)&&yy1<=max(y,yy)&&yy1>=min(y,yy)&&(xx-x)*(yy1-y)-(xx1-x)*(yy-y)==0)
return 1;
//3,2,4
else if(xx<=max(xx1,xx2)&&xx>=min(xx1,xx2)&&yy<=max(yy1,yy2)&&yy>=min(yy1,yy2)&&(xx1-xx)*(yy2-yy)-(xx2-xx)*(yy1-yy)==0)
return 1;
//1,4,2
else if(xx2<=max(x,xx)&&xx2>=min(x,xx)&&yy2<=max(y,yy)&&yy2>=min(y,yy)&&(xx2-x)*(yy-y)-(xx-x)*(yy2-y)==0)
return 1;
//3,1,4
else if(x<=max(xx1,xx2)&&x>=min(xx1,xx2)&&y<=max(yy1,yy2)&&y>=min(yy1,yy2)&&(x-xx1)*(yy2-yy1)-(xx2-xx1)*(y-yy1)==0)
return 1;
return 0;
}
bool klsy(double x,double y,double xx,double yy,double xx1,double yy1,double xx2,double yy2)
{
if(((xx-x)*(yy1-y)-(xx1-x)*(yy-y))*((xx-x)*(yy2-y)-(xx2-x)*(yy-y))<0)
if(((x-xx1)*(yy2-yy1)-(xx2-xx1)*(y-yy1))*((xx-xx1)*(yy2-yy1)-(xx2-xx1)*(yy-yy1))<0)
return 1;
return 0;
}
int main()
{
while(scanf("%d",&n))
{
memset(dis,0,sizeof(dis));
if(n==0)
return 0;
for(int i=1; i<=n; i++)
scanf("%lf%lf%lf%lf",&x[i],&y[i],&xx[i],&yy[i]);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(klsy(x[i],y[i],xx[i],yy[i],x[j],y[j],xx[j],yy[j])||kspc(x[i],y[i],xx[i],yy[i],x[j],y[j],xx[j],yy[j]))
dis[i][j]=1,dis[j][i]=1;
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
dis[i][j]=dis[i][j]||(dis[i][k]&&dis[k][j]);
while(scanf("%d%d",&qd,&zd))
{
if(qd==0&&zd==0)
break;
if(dis[qd][zd]==1||dis[zd][qd]==1)
printf("CONNECTED\n");
else
printf("NOT CONNECTED\n");
}
}
return 0;
}