题意:在桌上一次放n根木棒,求最上面的木棒编号;

思路:暴力枚举,看每根木棒上是否有木棒;

技巧:使用叉积,判断一个向量的两端点是否在另一向量的同侧,从而判断相交;

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const double epsi=1e-10;
const int maxn=100005;
inline int sign(const double &x){if(x>epsi) return 1;if(x<-epsi) return -1;return 0;
}
struct point{double x,y;point(){}point(double xx,double yy):x(xx),y(yy){}point operator -(const point &op2) const{return point(x-op2.x,y-op2.y);}double operator ^(const point &op2) const{return x*op2.y-y*op2.x;}
};
inline double sqr(const double &x){return x*x;
}
inline double mul(const point &p0,const point &p1,const point &p2){return (p1-p0)^(p2-p1);
}
inline double dis2(const point &p1,const point &p2){return sqr(p1.x-p2.x)+sqr(p1.y-p2.y);
}
inline double dis(const point &p0,const point &p1){return sqrt(dis2(p0,p1));
}
inline int cross(const point &p1,const point &p2,const point &p3,const point &p4)
{double a1=mul(p1,p2,p3),a2=mul(p1,p2,p4);if(sign(a1)==0&&sign(a2)==0) return 2;  //两向量共线if(sign(a1)==sign(a2)) return 0;  //两向量不相交return 1;       //两向量相交
}
int n;
point p1[maxn],p2[maxn];
int main()
{int t,i,j,k;while(scanf("%d",&n)){if(n==0) break;int f1=0;for(i=1;i<=n;i++){scanf("%lf %lf %lf %lf",&p1[i].x,&p1[i].y,&p2[i].x,&p2[i].y);}printf("Top sticks:");for(i=1;i<=n;i++){int flag=0;for(j=i+1;j<=n;j++){if(cross(p1[i],p2[i],p1[j],p2[j])&&cross(p1[j],p2[j],p1[i],p2[i]))//因为是线段,所以要相互判断{flag=1;break;}}if(flag==0&&f1) printf(",");if(flag==0) printf(" %d",i),f1=1;}printf(".\n");}return 0;
}

转载于:https://www.cnblogs.com/dashuzhilin/p/4539659.html

poj 2653 Pick-up sticks(判断线段相交)相关推荐

  1. POJ 2653 Pick-up sticks 判断线段相交

    枚举每条线段 这条线段上面没有与它相交的线段 #include <iostream> #include <cstdio> #include <cstring> #i ...

  2. 判断线段相交(hdu1558 Segment set 线段相交+并查集)

    先说一下题目大意:给定一些线段,这些线段顺序编号,这时候如果两条线段相交,则把他们加入到一个集合中,问给定一个线段序号,求在此集合中有多少条线段. 这个题的难度在于怎么判断线段相交,判断玩相交之后就是 ...

  3. 【计算几何】判断线段相交(跨立实验)

    题意:有n条线段(编号为1n),按1n的顺序放在二维坐标系上(就是先放1号,再放2号--),要求输出最上面的那些线段的编号.(就是没有其他线段压在它上面的那些线段) 注意:有交点即为被压. 1.叉积 ...

  4. 判断线段相交 + vector. erase迭代指针 的使用 poj 2653 Pick-up sticks

    题目来源:http://poj.org/problem?id=2653 分析: 题意:按顺序给出一些木棍,输出在最上面的木棍标号. 用vector 存储木棍标号, 当前木棍与 vector 中的木棍 ...

  5. POJ 2653 Pick-up sticks (线段相交)

    题意:给你n条线段依次放到二维平面上,问最后有哪些没与前面的线段相交,即它是顶上的线段 题解:数据弱,正向纯模拟可过 但是有一个陷阱:如果我们从后面向前枚举,找与前面哪些相交,再删除前面那些相交的线段 ...

  6. 几何基础之判断线段相交问题

    1.判断两线段相交 只要判断q1,q2在线段s1s2的两侧和s1,s2在线段q1q2的两侧. q1s1q2s1>0就是在两侧. 2.矩形里有n条直线,一条直线的终点是另一条直线的起点.问矩形被分 ...

  7. Pipe HDU - 2150(判断线段相交+向量叉乘线代详解)

    题目: 经过激烈的争夺,Lele终于把那块地从Yueyue的手里抢了回来.接下来,Lele要开始建造他的灌溉系统. 通过咨询Lele的好友--化学系的TT,Lele决定在田里挖出N条沟渠,每条沟渠输送 ...

  8. 几何常用算法与判断线段相交【转】

    下面这个函数在我写的计算几何库函数里面有,那个库可以在http://algorithm.126.com/的资源中心   -   代码角   找到. 算法简单说明: 首先判断以两条线段为对角线的矩形是否 ...

  9. 德莱联盟[判断线段相交]

    德莱联盟 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 欢迎来到德莱联盟.... 德莱文... 德莱文在逃跑,卡兹克在追.... 我们知道德莱文的起点和终点坐标,我们也 ...

  10. NYOJ1016(德莱联盟)(判断线段相交)

    德莱联盟 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 欢迎来到德莱联盟.... 德莱文... 德莱文在逃跑,卡兹克在追.... 我们知道德莱文的起点和终点坐标,我们也 ...

最新文章

  1. 计算机科学和Python编程导论(三) 一些简单的数值程序
  2. python学习手册中文版免费下载-Python学习手册 第三版
  3. 设A和B是两个按元素值递增有序的单链表,写一算法将A和B归并为按按元素值递减有序的单链表C,试分析算法的时间复杂度。(利用上篇带有头结点的线性链表操作)...
  4. Java中Set巧用,去掉重复数据
  5. 在不同浏览器中,input里面的输入光标大小表现形式却大不相同
  6. uglifyjs压缩JS
  7. 第十二届蓝桥杯大赛软件赛省赛 C/C++ 大学B组
  8. php7扩展sphinx,php7进行安装sphinx简单记录
  9. java技术架构选型方案报告.pdf,来啦,2020开源报告!
  10. android平板电脑浏览器,安卓平板用什么浏览器
  11. 练习编程思维的小游戏
  12. 【TL431】TL431精密电压调节器简介
  13. mongodb数据库扩展名_MongoDB文件型数据库
  14. [导读]7 Steps to Mastering Machine Learning With Python
  15. 海信E8K和E8H区别对比哪个好
  16. docker add new port
  17. 获取 JSON 数据得个数 length
  18. 报错AttributeError: ‘NoneType‘ object has no attribute ‘shape‘
  19. 双音多频 DTMF原理
  20. AOSP 8.0 系统启动之四ART虚拟机启动(一)

热门文章

  1. CSS 全解析实战(一)-导读
  2. Oracle - 安装 Oracle Database 11g Release 2
  3. SharePoint中CAML使用的一些总结
  4. 第十八章 lamp架构
  5. 德国软件巨头SAP旗下风投基金募集10亿美元 专门投资科技初创公司
  6. 从 ReactiveCocoa 中能学到什么?不用此库也能学以致用
  7. java生成实体类的工具内部是如何实现的(mysql)
  8. linux下修改当前目录下图像文件并删除
  9. printf 规定数据输出方式
  10. java中double类型占几个字节_面试官:Java 中有几种基本数据类型是什么?各自占用多少字节?...