题目描述

【题意】
有n条线段(编号为1~n),按1~n的顺序放在二维坐标系上(就是先放1号,再放2号……),
要求输出最上面的那些线段的编号(就是没有其他线段压在它上面的那些线段)
【输入格式】
第一行第一个数n( 1 <= n <= 10000)表示这组数据有n条线段。
下来n行,每行两个坐标,表示第i条线段的两个端点。
【输出格式】
一行。输出最上面的线段的编号(从小到大)。相邻两个编号用空格隔开,最后一个编号没有空格。
【样例1输入】
5
1 1 4 2
2 3 3 1
1 -2.0 8 4
1 4 8 2
3 3 6 -2.0
【样例1输出】
2 4 5
【样例2输入】
3
0 0 1 1
1 0 2 1
2 0 3 1
【样例2输出】

1 2 3

主要运用了叉积,

首先a向量叉乘b向量=|a|b|sinC

然后只要码代码就好了

#include<iostream>
#include<cstdio>
#include<math.h>
#include<cstring>
#include<algorithm>
#include<queue>
#include<set>
#include<vector>
using namespace std;
int n;
typedef struct Node{double x1,y1,x2,y2;
};
typedef struct No{double x,y;
};
Node node[10000+10];
double chaji(No n0,No n1,No n2){return (n1.x-n0.x)*(n2.y-n0.y)-(n2.x-n0.x)*(n1.y-n0.y);
}
int check(int i,int j){No n1,n2,n3,n4;n1.x=node[i].x1;n1.y=node[i].y1;n2.x=node[i].x2;n2.y=node[i].y2;n3.x=node[j].x1;n3.y=node[j].y1;n4.x=node[j].x2;n4.y=node[j].y2;if(chaji(n1,n2,n3)*(chaji(n1,n2,n4))<0&&(chaji(n3,n4,n1)*(chaji(n3,n4,n2))<0)) return 1;if((chaji(n1,n2,n3)==0&&n3.x<=max(n1.x,n2.x)&&n3.x>=min(n1.x,n2.x)) ||(chaji(n1,n2,n4)==0&&n4.x<=max(n1.x,n2.x)&&n4.x>=min(n1.x,n2.x)) ||(chaji(n1,n4,n3)==0&&n1.x<=max(n3.x,n4.x)&&n1.x>=min(n3.x,n4.x)) ||(chaji(n2,n4,n3)==0&&n2.x<=max(n3.x,n4.x)&&n2.x>=min(n3.x,n4.x))   ) return 1; return 0;
}
int main(){cin>>n;for(int i=0;i<n;i++){scanf("%lf%lf%lf%lf",&node[i].x1,&node[i].y1,&node[i].x2,&node[i].y2);}int v[10000+10]={0}; for(int i=0;i<n-1;i++){for(int j=i+1;j<n;j++){if(check(i,j)){v[i]=1;break;}}}int out[10000+10],len=0;for(int i=0;i<n;i++) if(v[i]==0) out[len++]=i+1;cout<<out[0];for(int i=1;i<len;i++) printf(" %d",out[i]);return 0;
}

判断两条线段相交(跨立实验)相关推荐

  1. 51nod 1264 线段相交(跨立实验)

    51nod1264:线段相交 判断线段相交: 关于快速排斥和跨立实验的博客:https://blog.csdn.net/li1615882553/article/details/80372202 在快 ...

  2. 如何判断两条线段相交(python实现)

    向量叉乘(行列式计算):向量a(x1,y1),向量b(x2,y2): 首先我们要明白一个定理:向量a×向量b(×为向量叉乘),若结果小于0,表示向量b在向量a的顺时针方向:若结果大于0,表示向量b在向 ...

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

    欢迎大家访问我的老师的OJ---caioj.cn 题面描述 传送门 思考 看完视频之后, 发现SCY讲得真(mo)好(hu). 下面我来总结一下规律: 我们以 p 1 p_1 p1​为原点,判断 p ...

  4. JAVA计算两条直线的交点(判断两条线段相交)

    //计算两条直线的交点 //输入四个点,前两个点确定线段1,后两个点确定线段2 //输出交点坐标 public class Main{public static void main(String ar ...

  5. 快速排斥、跨立实验判断线段是否相交

    写在前面 在其他博客中看到这方面的知识,很多都是重复,并且说的总是云里雾里的,所以这里我就自己总结一下这种问题如何求解,判断两个线段是否相交在前面我们提到了会用到叉积的一点知识,那么这里就来详细说一下 ...

  6. 判断两条线段是否相交 java_判断两个线段是否相交02

    写在前面 在其他博客中看到这方面的知识,很多都是重复,并且说的总是云里雾里的,所以这里我就自己总结一下这种问题如何求解,判断两个线段是否相交在前面我们提到了会用到叉积的一点知识,那么这里就来详细说一下 ...

  7. 判断两条线段/直线相交,并求交点

      一.矢量基本知识     因为后面的计算需要一些矢量的基本知识,这里只是简单的列举如下,如果需要更加详细的信息,可以自行搜索wikipedia或google. 1.矢量的概念:如果一条线段的端点是 ...

  8. 判断两线段是否相交——快速排斥与跨立实验

    如何判断两条线段是否相交呢?如果是我们去解决这个问题,用眼睛很容易就看出来了,但是如果用计算机来解决这个问题,该怎么办呢?下面介绍两个方法,这两个方法结合起来就能完美解决这个问题了. 一.快速排斥 对 ...

  9. 跨立实验判断线段是否相交-POJ3304

    在二维坐标下介绍一些定义: 点:A(x1,y1),B(x2,y2) 向量:向量AB=( x2 - x1 , y2 - y1 )= ( x , y ); 向量的模 |AB| = sqrt ( x*x+y ...

最新文章

  1. SAP WM LT10事务代码的一个坑?
  2. Java能做什么?学完Java可以从事什么工作呢?
  3. Qt定时器QBasicTimer、startTimer、QTimer使用总结
  4. logstash 获取多个kafka_logstash 配置详解
  5. 将一张表的主键(ID)重置为从1开始自增排列
  6. 基于SpringBoot+mybatis+layui就业管理系统设计和实现
  7. Elasticsearch学习系列-搜索技术基本知识
  8. TikZ学习笔记(二)循环
  9. Spring简单入门实例
  10. 链队列约瑟夫环c++代码_数据结构之约瑟夫环C语言实现
  11. 集体心智:社会网络拓扑塑造集体认知
  12. linux 删除开机密码,6种清除开机密码方法,总有一个适合你
  13. 微型计算机上的射箭成为什么,《说文解字》第429课:“谢”字里为什么有一个“射箭”的“射”...
  14. hihocoder 1251 Today Is a Rainy Day 2015北京区域赛C
  15. 支持向量机算法+数据读取+多倍交叉验证实现
  16. 淘特(淘宝特价版)关键词搜索
  17. 安卓最新版本_腾讯手机管家下载最新版本-腾讯手机管家2020新版本下载v8.8.1 安卓官方版...
  18. less/sass中属性选择器使用方法
  19. 秦储数字藏品平台正式上线公测 | 实名注册用户首日突破2万!
  20. postgreSQL+数组及复合类型=王炸

热门文章

  1. c#中如何获取电脑硬件信息?山寨一个鲁大师
  2. Android 蓝牙开发——HCI log 分析(十九)
  3. 全球及中国电动牙刷行业消费需求态势与投资机遇研究报告2022版
  4. tips---知识型
  5. 《岗位说明书》--老白的作业
  6. 5.10.15,20-四对羟基苯基卟啉[T(P-OH)PP];水溶性5,10,15,20-四(4-亚磷酸)铁(Ⅲ)卟啉(TPPFe(Ⅲ))齐岳供应卟啉定制
  7. 简明x86汇编语言教程
  8. 2022最新黑马程序员大数据Hadoop教程(补充) 苹果系统 vmware fusion导入虚拟机workstation的node1,node2,node3节点
  9. 在C语言中使用英文字符
  10. 使用函数实现两个数的交换(C语言)