捡火柴的Nova君(n个线段相交问题)
题目来源:https://biancheng.love/contest-ng/index.html#/41/problems
捡火柴的Nova君
题目描述
南方没暖气,怕冷的的宝宝们只能用火柴取暖。然而Nova君害怕火烧到手指头,当木头梗还有一大截的时候就慌忙把火柴丢到地上踩灭了,没多久,地上就七零八落,躺着一堆木棍,有得木梗还盖在了别的上面。现在Nova君打算收拾残局,他准备一根一根捡起火柴,但他很怕多花力气,所以决定优先捡起没有被盖住的火柴梗(因为被盖住的捡起来更费力嘛),所以现在Nova君,有多少根火柴是没有被盖住的呢?
输入
多组测试数据(组数不超过100),对于每组数据,第一行为一个正整数N,表示火柴梗的根数,接下来N行,每行四个浮点数a1,a2,b1,b2,分别表示火柴梗两个端点的横纵坐标。(请用double数据类型,保证输入数据合法)
输出
对于每组数据,输出一行,表示没有被盖住的火柴序号(输出的相对顺序与输入时保持一致)
输入样例
2
1 1 2 2
1 1 3 3
3
0 0 1 1
1 0 2 1
2 0 3 1
输出样例
2
1 2 3
Hint
抽象出的线段,只要有点重合,就算是覆盖了
解题思路:
一根火柴两个端点,两个端点组成一个线段。意思就是找到没有被覆盖的火柴序号。
注意:火柴序号即火柴输入的顺序(1,2,3。。。)
姿势很多,给出结构体代码:
#include <bits/stdc++.h>
#define eps 1e-6
#define MAX 100010 using namespace std; int sgn(double x)
{
if(fabs(x)<eps)
return ;
if(x<)
return -;
else return ;
} struct Point
{
double x,y;
Point() {}
Point(double x1,double y1)
{
x=x1;
y=y1;
}
Point operator -(Point b)
{
return Point(x-b.x,y-b.y);
}
double operator ^(const Point b)
{
return x*b.y-y*b.x;
}
double operator *(Point b)
{
return x*b.x+y*b.y;
}
}; struct Line
{
Point start,over;
Line() {}
Line(Point start1,Point over1)
{
start=start1;
over=over1;
}
}; bool cs(Line l1,Line l2)
{
return
( max(l1.start.x,l1.over.x)>=min(l2.start.x,l2.over.x)
&&max(l2.start.x,l2.over.x)>=min(l1.start.x,l1.over.x)
&&max(l1.start.y,l1.over.y)>=min(l2.start.y,l2.over.y)
&&max(l2.start.y,l2.over.y)>=min(l1.start.y,l1.over.y)
&&sgn((l2.start-l1.start)^(l1.over-l1.start))*sgn((l2.over-l1.start)^(l1.over-l1.start))<=
&&sgn((l1.start-l2.start)^(l2.over-l2.start))*sgn((l1.over-l2.start)^(l2.over-l2.start))<= );
} Line line[MAX];
bool flag[MAX];
int main()
{
int n,i,j;
double x1,y1,x2,y2;
while(~scanf("%d",&n))
{
for(i=;i<=n;i++)
{
scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
line[i]=Line(Point(x1,y1),Point(x2,y2));
flag[i]=true;
}
for(i=;i<=n;i++)
{
for(j=i+;j<=n;j++)
if(cs(line[i],line[j]))
{
flag[i]=false;
break;
}
}
for(i=;i<=n;i++)
{
if(flag[i])
{
printf("%d ",i);
}
}
printf("\n");
}
return ;
}
捡火柴的Nova君(n个线段相交问题)的更多相关文章
- 忙碌的Nova君 (活动安排问题、贪心算法)
题目描述 理论上,Nova君是个大闲人,但每天还是有一大堆事要干,大作业啦,创新杯啦,游戏啦,出题坑人啦,balabala......然而精力有限,Nova君同一时间只能做一件事,并不能一心二用.假设 ...
- HDU 3492 (直线与所有线段相交) Segment
题意: 给出n个线段,判断是否存在一条直线使得所有线段在直线上的射影的交非空. 分析: 如果我们找到一条与所有线段相交的直线,然后做一条与该直线垂直的直线,这些线段在直线上的射影就一定包含这个垂足. ...
- poj1127 Jack Straws(线段相交+并查集)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Jack Straws Time Limit: 1000MS Memory L ...
- POJ 1066 Treasure Hunt (线段相交)
题意:给你一个100*100的正方形,再给你n条线(墙),保证线段一定在正方形内且端点在正方形边界(外墙),最后给你一个正方形内的点(保证不再墙上) 告诉你墙之间(包括外墙)围成了一些小房间,在小房间 ...
- POJ 2653 Pick-up sticks (线段相交)
题意:给你n条线段依次放到二维平面上,问最后有哪些没与前面的线段相交,即它是顶上的线段 题解:数据弱,正向纯模拟可过 但是有一个陷阱:如果我们从后面向前枚举,找与前面哪些相交,再删除前面那些相交的线段 ...
- HDU1086You can Solve a Geometry Problem too(判断线段相交)
You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/3 ...
- POJ 2653 Pick-up sticks【线段相交】
题意:n根木棍随意摆放在一个平面上,问放在最上面的木棍是哪些. 思路:线段相交,因为题目说最多有1000根在最上面.所以从后往前处理,直到木棍没了或者最上面的木棍的总数大于1000. #include ...
- POJ 1556 The Doors【最短路+线段相交】
思路:暴力判断每个点连成的线段是否被墙挡住,构建图.求最短路. 思路很简单,但是实现比较复杂,模版一定要可靠. #include<stdio.h> #include<string.h ...
- 还记得高中的向量吗?leetcode 335. Self Crossing(判断线段相交)
传统解法 题目来自 leetcode 335. Self Crossing. 题意非常简单,有一个点,一开始位于 (0, 0) 位置,然后有规律地往上,左,下,右方向移动一定的距离,判断是否会相交(s ...
随机推荐
- NopCommerce之任务执行
NOP任务提供两种:手动执行(立即)和定时执行两种. 首先来说下手动任务执行过程,下图是NOP定时任务管理界面: 从上面可以看出,我们可以选择具体的任务来手动执行任务(立即执行),当点击[立即执行]按 ...
- sitemesh学习笔记(3)
前两篇博客浅谈了一下sitemesh3.0和2.4的区别和简单用法,今天我做了一个结合sturts2的sitemesh构架,由于strusts2只能用sitemesh2.x的版本,与3.0目前还不能兼 ...
- hive的内部表与外部表创建
最近才接触Hive.学到了一些东西,就先记下来,免得以后忘了. 1.创建表的语句:Create [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_na ...
- js 各种数值类型正则匹配检测
随拿随用只js正则表达式,反正平时工作我是不写正则的,大神请自动绕行: 验证数字的正则表达式集验证数字:^[0-9]*$验证n位的数字:^\d{n}$验证至少n位数字:^\d{n,}$验证m-n位的数 ...
- sprint3(第八天)
昨天忘了发博客,最近在整合前台和后台的内容,在sprint结束前应该能整合好,然后实现前后台的联系,实现点餐功能. 最近要准备大作业也要复习四六级考试,所以花在项目的时间比较少了,请老师谅解. 燃尽图
- JS代码的位置与事件响应代码块的封装问题
JS代码的位置 我们可以将JavaScript代码放在html文件中任何位置,但是我们一般放在网页的head或者body部分. 放在<head>部分最常用的方式是在页面中h ...
- 一个端口操作类PortHelper
此操作类主要使用了系统命令行来实现的,详细的命令可参照微软文档<如何使用"netsh advfirewall firewall"上下文而非“netsh firewall”上下 ...
- 【jQuery基础学习】09 jQuery与前端(这章很水)
这章主要是将如何将jQuery应用到网站中,或者说其实就是一些前端知识,对于我这种后端程序来说其实还是蛮有用的. 关于网站结构 文件结构 前端文件分三个文件夹放 images文件夹用来存放将要用到的图 ...
- php学习笔记:读取文档的内容,利用php修改文档内容
直接上代码 <?php /** * Created by PhpStorm. * User: Administrator * Date: 2016/9/10 0010 * Time: 20:27 ...
- 终端&作业控制&会话启动过程
进程组 每个进程除了有个进程id外,还属于一个进程组.进程组是一个或者多个进程的集合.通常他们与同一个作业相关联,可以接受来自同一终端的信号.进程组id等于其进程组长id.进程组的终止与进程组长是否存 ...