您的位置:首页 > 其它

uva11343 Isolated Segments

2016-05-16 20:34 204 查看
题意:给了很多线段,点的坐标都是整数,并且绝对值 <1000,如果某一条线段和其他任何一条线段都不想交,就是被隔离的,求出被隔离线段的个数

分析:

这还是一道简单的叉积题

/*
线段相交
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
//#define T
#define def 1e-6
using namespace std;
//点
struct Point
{
double x;
double y;
};

//判断点在pi-pj在线段的那一侧
int direction(Point* pi,Point* pj,Point* pk)
{
Point p1,p2;
p1.x = pk->x - pi->x;
p1.y = pk->y - pi->y;
p2.x = pj->x - pi->x;
p2.y = pj->y - pi->y;
double cross = p1.x*p2.y - p2.x*p1.y;
if(cross >= def)
return 1;
else if(cross <= -def)
return -1;
else
return 0;
}
//判断点是否在pi和pj为对角点的矩形里
bool onSegment(Point* pi,Point* pj,Point* pk)
{
double minx,miny,maxx,maxy;
if(pi->x > pj->x)
{
minx = pj->x;
maxx = pi->x;
}
else
{
minx = pi->x;
maxx = pj->x;
}
if(pi->y > pj->y)
{
miny = pj->y;
maxy = pi->y;
}
else
{
miny = pi->y;
maxy = pj->y;
}
return (minx <= pk->x)&&(maxx >= pk->x)&&(miny <=pk->y)&&(maxy >= pk->y);
}
//判断线段相交
bool segmentIntersect(Point* p1,Point* p2,Point* p3,Point* p4)
{
int d1 = direction(p3,p4,p1);
int d2 = direction(p3,p4,p2);
int d3 = direction(p1,p2,p3);
int d4 = direction(p1,p2,p4);
if(d1*d2 < 0&&d3*d4 < 0)
return true;
if(!d1 && onSegment(p3,p4,p1))
return true;
if(!d2 && onSegment(p3,p4,p2))
return true;
if(!d3 && onSegment(p1,p2,p3))
return true;
if(!d4 && onSegment(p1,p2,p4))
return true;
return false;
}
vector<Point> Li,Lj;
vector<bool> flag;
int main()
{
#ifdef T
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif // T
int n,m,count_num,i,j;
scanf("%d",&n);

while(n--)
{
scanf("%d",&m);
Li.resize(m);
Lj.resize(m);
flag.resize(m+1);
count_num = 0;
for(i = 0; i < m; i++)
{
scanf("%lf %lf %lf %lf",&Li[i].x,&Li[i].y,&Lj[i].x,&Lj[i].y);
flag[i] = false;
}
for(i=0; i<m; i++)
{
for(j = 0; j<m; j++)
{
if(i != j)
if(segmentIntersect(&Li[i],&Lj[i],&Li[j],&Lj[j]))
{
// printf("i = %d  j = %d\n",i,j);
flag[i] = true;
//  flag[m] = false;
//break;
}
}
}
for(i=0; i<m; i++)
{
if(!flag[i])
count_num++;
}
printf("%d\n",count_num);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: