poj3304Segments(直线与多条线段相交)

链接

枚举两点(端点),循环遍历与直线相交的线段。

  1 #include <iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<stdlib.h>
  6 #include<vector>
  7 #include<cmath>
  8 #include<queue>
  9 #include<set>
 10 using namespace std;
 11 #define N 105
 12 #define LL long long
 13 #define INF 0xfffffff
 14 const double eps = 1e-10;
 15 const double pi = acos(-1.0);
 16 const double inf = ~0u>>2;
 17 struct point
 18 {
 19     double x,y;
 20     point(double x=0,double y = 0):x(x),y(y){}
 21 }p[N<<1];
 22 struct line
 23 {
 24     point a,b;
 25 };
 26 typedef point pointt ;
 27 pointt operator -(point a,point b)
 28 {
 29     return point(a.x-b.x,a.y-b.y);
 30 }
 31 int dcmp(double x)
 32 {
 33     if(fabs(x)<eps) return 0;
 34     return x<0?-1:1;
 35 }
 36 double cross(point a,point b)
 37 {
 38     return a.x*b.y-a.y*b.x;
 39 }
 40 double xmult(point a,point b,point c)
 41 {
 42     return cross(a-c,b-c);
 43 }
 44 int dotline(point p,line l)
 45 {
 46     return (!dcmp(xmult(p,l.a,l.b)))&&(l.a.x-p.x)*(l.b.x-p.x)<eps
 47                 &&(l.a.y-p.y)*(l.b.y-p.y)<eps;
 48 }
 49 double dis(point a)
 50 {
 51     return sqrt(a.x*a.x+a.y*a.y);
 52 }
 53 int Intersection( point a,point b,point c,point d )
 54 {
 55     int d1,d2;
 56     d1 = dcmp(xmult( a,c,b ));
 57     d2 = dcmp(xmult( a,d,b ));
 58     if( d1*d2==-1 ) return 1;//规范相交
 59      if( d1==0||d2==0 ) return 2;//非规范相交
 60     return 0;//不相交
 61 }
 62 int main()
 63 {
 64     int t,i,j,n,g;
 65     cin>>t;
 66     while(t--)
 67     {
 68         cin>>n;
 69         for(i=  1; i <= n; i++)
 70         {
 71             scanf("%lf%lf%lf%lf",&p[i].x,&p[i].y,&p[i+n].x,&p[i+n].y);
 72         }
 73         if(n==1||n==2)
 74         {
 75             puts("Yes!");
 76             continue;
 77         }
 78         int flag = 0;
 79         for(i = 1; i <= 2*n;  i++)
 80         {
 81             for(j = i+1; j<= 2*n; j++)
 82             {
 83                 line l1;
 84                 l1.a = p[i],l1.b = p[j];
 85                 if(dcmp(dis(p[i]-p[j]))==0) continue;
 86                 int num = 0;
 87                 for(g = 1; g <= n ;g++)
 88                 {
 89                    if(Intersection(p[i],p[j],p[g],p[g+n])) num++;
 90                    else break;
 91                 }
 92                 if(num==n)
 93                 {
 94                     flag = 1;
 95                     break;
 96                 }
 97             }
 98             if(flag) break;
 99         }
100         if(flag) puts("Yes!");
101         else puts("No!");
102     }
103     return 0;
104 }

poj3304Segments(直线与多条线段相交)

时间: 2024-08-30 14:29:28

poj3304Segments(直线与多条线段相交)的相关文章

(hdu step 5.1.3)Segment set(求与一条线段相交的线段集合中的线段的数量)

题目: Segment set Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 177 Accepted Submission(s): 82   Problem Description A segment and all segments which are connected with it compose a segment set. T

POJ 3304 Segments(计算几何:直线与线段相交)

POJ 3304 Segments 大意:给你一些线段,找出一条直线能够穿过所有的线段,相交包括端点. 思路:遍历所有的端点,取两个点形成直线,判断直线是否与所有线段相交,如果存在这样的直线,输出Yes,但是注意去重. struct Point { double x, y; } P[210]; struct Line { Point a, b; } L[110]; double xmult(Point p1, Point p2, Point p) { return (p1.x-p.x)*(p2.

hdu 1558 (线段相交+并查集) Segment set

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1558 题意是在坐标系中,当输入P(注意是大写,我当开始就wa成了小写)的时候输入一条线段的起点坐标和终点坐标,当输入Q的时候输入n,然后输出与第n条线段相交的线段有多少条 首先判断线段是否相交,在算法导论p577上有介绍 线段A(x1,y1)-B(x2,y2),所在直线L1方程为F1(x,y)=0;线段C(x3,y3)-D(x4,y4),所在直线L2方程为F2(x,y)=0; 如何判断两条线段有交点:(

POJ 3304 Segments (叉乘判断线段相交)

<题目链接> 题目大意: 给出一些线段,判断是存在直线,使得该直线能够经过所有的线段.. 解题思路: 如果有存在这样的直线,过投影相交区域作直线的垂线,该垂线必定与每条线段相交,问题转化为问是否存在一条线和所有线段相交. 如果存在这么一条直线,那么该直线一定能够移成经过两个端点的形式.枚举所有线段的两个端点,判断该直线和所有线段是否相交即可. #include <iostream> #include <math.h> #include <cstdio> us

poj 3304 直线与线段相交

Segments Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12161   Accepted: 3847 Description Given n segments in the two dimensional space, write a program, which determines if there exists a line such that after projecting these segments

POJ 3304 Segments[直线与线段相交]

Segments Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13514   Accepted: 4331 Description Given n segments in the two dimensional space, write a program, which determines if there exists a line such that after projecting these segments

HDU 3492 (直线与所有线段相交) Segment

题意: 给出n个线段,判断是否存在一条直线使得所有线段在直线上的射影的交非空. 分析: 如果我们找到一条与所有线段相交的直线,然后做一条与该直线垂直的直线,这些线段在直线上的射影就一定包含这个垂足. 所以我们只要判断是否存在一条直线与所有的点相交即可. 如果存在这样一条直线,那么将这条直线平移或者旋转,就会被这些线段中的某两个端点“卡”住. 所以我们枚举两个端点,然后判断这些线段是否与这两个点所在的直线都相交即可. 本以为是一道很简单的计算几何,结果卡了好几天. 看了别人的题解,才发现问题所在.

POJ 3304 Segments 判断直线和线段相交

POJ 3304  Segments 题意:给定n(n<=100)条线段,问你是否存在这样的一条直线,使得所有线段投影下去后,至少都有一个交点. 思路:对于投影在所求直线上面的相交阴影,我们可以在那里作一条线,那么这条线就和所有线段都至少有一个交点,所以如果有一条直线和所有线段都有交点的话,那么就一定有解. 怎么确定有没直线和所有线段都相交?怎么枚举这样的直线?思路就是固定两个点,这两个点在所有线段上任意取就可以,然后以这两个点作为直线,去判断其他线段即可.为什么呢?因为如果有直线和所有线段都相

hdu 3304(直线与线段相交)

Segments Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12042   Accepted: 3808 Description Given n segments in the two dimensional space, write a program, which determines if there exists a line such that after projecting these segments