POJ 1127 Jack Straws【计算几何】【Floyd传递闭包】

44 篇文章 0 订阅
12 篇文章 0 订阅

题目

在这里插入图片描述

思路

又是一道缝合怪。
这道题直接判断线段相交+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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值