POJ 2653 线段相交问题

来源:互联网 发布:矩阵化为行最简形 编辑:程序博客网 时间:2024/04/29 22:40

题意: 按顺序给出一堆线段的端点坐标   求最后没被覆盖的线段的序号  被覆盖(即后放入与先放入的相交)  利用叉积判断即可

#include <iostream>#include "stdio.h"#include "stdlib.h"#include "string.h"#include "math.h"#include "algorithm"#include <queue>using namespace std;#define modulo 1000000007const double eps=1e-8;int t,pos,first,last,vis[100001],ans,answer[1001];struct ed {    double x1,y1,x2,y2;}edge[100001];double mult(double x1,double y1,double x2,double y2,double x3,double y3){    return (x1-x3)*(y2-y3)-(y1-y3)*(x2-x3);}int  sgn(double x){    if(fabs(x)<eps) return 0;    if(x<0) return -1;    else return 1;}bool isinter(ed l1,ed l2){    return        max(l1.x1,l1.x2)>=min(l2.x1,l2.x2)&&        max(l2.x1,l2.x2)>=min(l1.x1,l1.x2)&&        max(l1.y1,l1.y2)>=min(l2.y1,l2.y2)&&        max(l2.y1,l2.y2)>=min(l1.y1,l1.y2)&&        sgn(mult(l1.x1,l1.y1,l1.x2,l1.y2,l2.x1,l2.y1))*sgn(mult(l1.x1,l1.y1,l1.x2,l1.y2,l2.x2,l2.y2))<=0&&        sgn(mult(l2.x1,l2.y1,l2.x2,l2.y2,l1.x1,l1.y1))*sgn(mult(l2.x1,l2.y1,l2.x2,l2.y2,l1.x2,l1.y2))<=0;}int main(void){    while(scanf("%d",&t)&&t)    {        pos=0;        ans=0;        memset(vis,0,sizeof vis);        for(int i=0;i<t;i++)            scanf("%lf%lf%lf%lf",&edge[i].x1,&edge[i].y1,&edge[i].x2,&edge[i].y2);        for(int i=0;i<t;i++)            for(int j=i+1;j<t;j++)                if(isinter(edge[i],edge[j])) {                    vis[i]=1;                    break;                }        printf("Top sticks:");        for(int i=0;i<t;i++)            if(!vis[i]) answer[pos++]=i+1;        for(int i=0;i<pos-1;i++)            printf(" %d,",answer[i]);        printf(" %d.\n",answer[pos-1]);    }}

0 0
原创粉丝点击