计算几何--判断两条线段相交--poj 2653
| Time Limit: 3000MS | Memory Limit: 65536K | |
| Total Submissions: 8862 | Accepted: 3262 |
Description
stick is always on top but he wants to know all the sticks that are on top. Stan sticks are very, very thin such that their thickness can be neglected.
Input
are listed in the order in which Stan has thrown them. You may assume that there are no more than 1000 top sticks. The input is ended by the case with n=0. This case should not be processed.
Output
The picture to the right below illustrates the first case from input.

Sample Input
5
1 1 4 2
2 3 3 1
1 -2.0 8 4
1 4 8 2
3 3 6 -2.0
3
0 0 1 1
1 0 2 1
2 0 3 1
0
Sample Output
Top sticks: 2, 4, 5.
Top sticks: 1, 2, 3.
Hint
Source
#include "cstdio"
#include "cmath"
#include "vector"
#include "iostream" using namespace std;
const double eps = 1e-8; double max(double a,double b){ return a>b?a:b; }
double min(double a,double b){ return a<b?a:b; } int cmp(double x){
if(fabs(x)<eps) return 0;
if(x>0) return 1;
return -1;
} inline double sqr(double x){
return x*x;
} struct point{ //点结构体
double x,y;
point(){}
point (double a,double b):x(a),y(b) {} //重载
void input(){
scanf("%lf%lf",&x,&y);
}
friend point operator + (const point a,const point b){
return point(a.x+b.x,a.y+b.y);
}
friend point operator - (const point a,const point b){
return point(a.x-b.x,a.y-b.y);
}
}; double det(const point &a,const point &b){ //向量a与向量b的叉积
return a.x*b.y-a.y*b.x;
} struct line{ //线结构体
point a,b;
line(){}
line(point x,point y):a(x),b(y){}
}; bool line_make_point_one(line a,line b){ //判断两线段是否相交,完美代码!
return
max(a.a.x,a.b.x) >= min(b.a.x,b.b.x) && //前四行判断两向量所形成的矩形是否相交,排除两线段在同一条直线但不相交的可能
max(b.a.x,b.b.x) >= min(a.a.x,a.b.x) &&
max(a.a.y,a.b.y) >= min(b.a.y,b.b.y) &&
max(b.a.y,b.b.y) >= min(a.a.y,a.b.y) &&
cmp(det(a.a-b.b,b.a-b.b))*cmp(det(a.b-b.b,b.a-b.b))<=0 && //判断两线段是否相交
cmp(det(b.a-a.a,a.b-a.a))*cmp(det(b.b-a.a,a.b-a.a))<=0;
} int main(){
int n;
while(scanf("%d",&n),n!=0)
{
line a;
vector<line> p; //线段向量
vector<int> v; //记录线段向量的下标
p.clear();
v.clear(); scanf("%lf %lf %lf %lf",&a.a.x,&a.a.y,&a.b.x,&a.b.y);
p.push_back(a);
v.push_back(1);
for(int k=2;k<=n;++k)
{
scanf("%lf %lf %lf %lf",&a.a.x,&a.a.y,&a.b.x,&a.b.y);
for(int i=0; i<(int)p.size(); ++i)
{
bool flag = line_make_point_one(a,p[i]);
if(flag==true)
{
p.erase(p.begin()+i);
v.erase(v.begin()+i);
i--;
}
}
p.push_back(a);
v.push_back(k);
}
printf("Top sticks:");
int i;
for( i=0; i<(int)v.size()-1; ++i)
printf(" %d,",v[i]);
printf(" %d.\n",v[i]);
}
return 0;
}
计算几何--判断两条线段相交--poj 2653的更多相关文章
- Pick-up sticks(判断两条线段是否相交)
Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 8351 Accepted: 3068 Description Stan has ...
- [CSharpTips]判断两条线段是否相交
判断两条线段是否相交 主要用到了通过向量积的正负判断两个向量位置关系 向量a×向量b(×为向量叉乘),若结果小于0,表示向量b在向量a的顺时针方向:若结果大于0,表示向量b在向量a的逆时针方向:若等于 ...
- 线段相交 POJ 2653
// 线段相交 POJ 2653 // 思路:数据比较水,据说n^2也可以过 // 我是每次枚举线段,和最上面的线段比较 // O(n*m) // #include <bits/stdc++.h ...
- poj 1127 -- Jack Straws(计算几何判断两线段相交 + 并查集)
Jack Straws In the game of Jack Straws, a number of plastic or wooden "straws" are dumped ...
- c# 判断两条线段是否相交(判断地图多边形是否相交)
private void button1_Click(object sender, EventArgs e) { //var result = intersect3(point1, point2, p ...
- 简单几何(线段相交) POJ 2653 Pick-up sticks
题目传送门 题意:就是小时候玩的一种游戏,问有多少线段盖在最上面 分析:简单线段相交,队列维护当前最上的线段 /******************************************** ...
- hdu 1086:You can Solve a Geometry Problem too(计算几何,判断两线段相交,水题)
You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/3 ...
- 平面内,线与线 两条线找交点 两条线段的位置关系(相交)判定与交点求解 C#
个人亲自编写.测试,可以正常使用 道理看原文,这里不多说 网上找到的几篇基本都不能用的 C#代码 bool Equal(float f1, float f2) { return (Math ...
- Jack Straws(判断线段是否相交 + 并查集)
/** http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1840 题意: 判断线段 ...
随机推荐
- WinForm界面开发之布局控件"WeifenLuo.WinFormsUI.Docking"的使用
WinForm界面开发之布局控件"WeifenLuo.WinFormsUI.Docking"的使用 转自:http://www.cnblogs.com/wuhuacong/arch ...
- ASP.NET MVC传送参数至服务端
ASP.NET MVC传送参数至服务端,前端与服务端的写法,你可以参考与采用适合你的需求的.当你只传递一两个参数也许觉得没有什么,如果一个方法中带的参数多的话,可以考虑model,前端可以考虑对象进行 ...
- Visual Studio《加载此属性页时出错》的解决办法
打开aspx页面时不能切换到设计视图,vs 2008工具箱中无控件.打开vs 2008的工具>选项>HTML设计器时提示:加载此属性页时出错 有时还会有其它错误提示,比如打开一个Windo ...
- python3.5.2爬虫
话不多说,都在代码里 #下载斗鱼颜值栏目主播照片 #author:ives #date:2016-8-28 21:58 #e-mail:renhanlinbsl@163.com import urll ...
- SharpGL学习笔记(十三) 光源例子:环绕二次曲面球体的光源
这是根据徐明亮<OpenGL游戏编程>书上光灯一节的一个例子改编的. 从这个例子可以学习到二次曲面的参数设置,程序中提供了两个画球的函数,一个是用三角形画出来的,一个是二次曲面构成的. 你 ...
- C# Web Api 上传文件
一. 使用默认方法上传文件: 1.Action: /// <summary> /// 上传文件 使用上传后的默认文件名称 /// 默认名称是BodyPart_XXXXXX,BodyPart ...
- 公司outing选项
Sign up: 2014 Summer Outing 请您从以下三个方案中选择您最感兴趣的一个项目, 如果您不能参加此次summer outing, 请选择"遗憾放弃"- ...
- C编程常见问题总结
本文是C编程中一些常见错误的总结,有些是显而易见的,有些则是不容易发现 本文地址:http://www.cnblogs.com/archimedes/p/get-screwed-c.html,转载请注 ...
- Android自定义控件之轮播图控件
背景 最近要做一个轮播图的效果,网上看了几篇文章,基本上都能找到实现,效果还挺不错,但是在写的时候感觉每次都要单独去重新在Activity里写一堆代码.于是自己封装了一下.本篇轮播图实现原理原文出处: ...
- IOS 网络浅析-(八 NSURLSession简介)
就在不长也不短的时间前,苹果正式命令咱们要向NSURLSession看,因此我们不得不认认真真的听从老大的教导,努力认知NSURLSession.其实呢,三方早已为我们解决了问题,但是呢,我们还是有必 ...