计算几何 - XOJ 1171 线段求交

问题

Description
线段求交即给定一组线段求出这些线段的相交情况,它是计算几何的基础问题之一,有着广泛的应用.
Input第一行为一个正整数n表示线段的个数(n<=10000)第二行到第n+1行每行包括4个正整数x1,y1,x2,y2, (0 <= x1,y1,x2,y2 <= 1000) x1,x2表示线段两端点的横坐标,y1,y2表示线段两端点的纵坐标注意线段的两端点可能重合 即(x1,y1)有可能等于(x2,y2)
Output一个正整数k, 表示相交的线段对数,这里只要两线段有接触即为相交.数据保证k<=100000.
Sample Input
8
10 13 20 56
37 60 40 7
87 57 113 5
96 16 125 51
171 4 231 4
200 4 211 43
268 36 354 36
283 4 314 36
Sample Output
3

TLE代码

#include<stdio.h>
#define N 10002/**
算法适用于整形点,不适用于浮点型 
**/typedef struct Point
{int x;int y;
}Point;double min(int x, int y)
{return x<y?x:y;
}double max(int x, int y)
{return x>y?x:y;
}//排斥实验
bool IsRectCross(const Point &p1,const Point &p2,const Point &q1,const Point &q2)
{bool ret = min(p1.x,p2.x) <= max(q1.x,q2.x)  &&min(q1.x,q2.x) <= max(p1.x,p2.x) &&min(p1.y,p2.y) <= max(q1.y,q2.y) &&min(q1.y,q2.y) <= max(p1.y,p2.y);return ret;
}
//跨立判断
bool IsLineSegmentCross(const Point &P1,const Point &P2,const Point &Q1,const Point &Q2)
{if(((Q1.x-P1.x)*(Q1.y-Q2.y)-(Q1.y-P1.y)*( Q1.x-Q2.x)) * ((Q1.x-P2.x)*(Q1.y-Q2.y)-(Q1.y-P2.y)*(Q1.x-Q2.x)) < 0 ||((P1.x-Q1.x)*(P1.y-P2.y)-(P1.y-Q1.y)*(P1.x-P2.x)) * ((P1.x-Q2.x)*(P1.y-P2.y)-(P1.y-Q2.y)*( P1.x-P2.x)) < 0) return true;elsereturn false;
}int main() //O(n^2)
{int n,i,j;Point arr[N][2];int count;  while(scanf("%d",&n)!=EOF && n!=0)//第一行为一个正整数n表示线段的个数(n<=10000){count=0;for(i=1;i<=n;i++)scanf("%d %d %d %d", &arr[i][0].x,  &arr[i][0].y, &arr[i][1].x,&arr[i][1].y); //第二行到第n+1行每行包括4个正整数x1,y1,x2,y2, (0 <= x1,y1,x2,y2 <= 1000) for(i=1; i<=n; i++)for(j=i+1; j<=n; j++)if(IsRectCross(arr[i][0],arr[i][1],arr[j][0],arr[j][1])&&IsLineSegmentCross(arr[i][0],arr[i][1],arr[j][0],arr[j][1]))count++;printf("%d\n",count);}return 0;   
}/** 
8
10 13 20 56
37 60 40 7
87 57 113 5
96 16 125 51
171 4 231 4
200 4 211 43
268 36 354 36
283 4 314 36            
**//**************************************************************Problem: 1171User: cld378632668Language: C++Result: Time Limit Exceed
****************************************************************/

AC 代码

#include <stdio.h>
#include <string.h>
#define p(x1,y1,x2,y2,a,b) ((y2-y1)*(a-x1)+(y1-b)*(x2-x1))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
int main()
{#ifndef ONLINE_JUDGEfreopen("1.in","r",stdin);
//    freopen("1.out","w",stdout);#endif // ONLINE_JUDGEint n,m;scanf("%d",&n);int x1[n+1],y1[n+1],x2[n+1],y2[n+1],i,j,a,b,c,d,sum=0;for (i=1;i<=n;i++)scanf("%d%d%d%d",x1+i,y1+i,x2+i,y2+i);for (i=1;i<n;i++)for (j=i+1;j<=n;j++){a=p(x1[j],y1[j],x2[j],y2[j],x1[i],y1[i]);b=p(x1[j],y1[j],x2[j],y2[j],x2[i],y2[i]);c=p(x1[i],y1[i],x2[i],y2[i],x1[j],y1[j]);d=p(x1[i],y1[i],x2[i],y2[i],x2[j],y2[j]);if (!a && !b && !c && !d){if (max(x1[i],x2[i])>=min(x1[j],x2[j]) && max(x1[j],x2[j])>=min(x1[i],x2[i]) && max(y1[i],y2[i])>=min(y1[j],y2[j]) && max(y1[j],y2[j])>=min(y1[i],y2[i]))sum++;}else{if ((a<=0 && b>=0 || a>=0 && b<=0) && (c<=0 && d>=0 || c>=0 && d<=0)){sum++;//printf("%d %d\n",i,j);}}}printf("%d\n",sum);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

类成员函数解析

1、 构造函数&#xff1a; &#xff08;1&#xff09; 定义&#xff1a;是一个特殊的成员函数&#xff0c;名字与类名相同&#xff0c;创建类类型对象时&#xff0c;由编译器自动调用&#xff0c;在对象的生命周期内只且只调用一次&#xff0c;以保证每个数据成员都有一…

add-apt-repository cloud-archive:liberty

apt-get update && apt-get upgrade; v

C++ 继承解析

继承 1、概念&#xff1a; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能。这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结构&#xff0c;体…

[傅里叶变换及其应用学习笔记] 九. 继续卷积的讨论

这份是本人的学习笔记&#xff0c;课程为网易公开课上的斯坦福大学公开课&#xff1a;傅里叶变换及其应用。 卷积在滤波中的应用 浑浊度&#xff08;Turbidity&#xff09;研究是关于测量水的清澈度的研究。大致方法是把光传感器放置到深水区域&#xff0c;然后测量光线的昏暗程…

C++多态相关关问题及虚表剖析

关于C多态的问题&#xff1a;&#xff08;基于Visual Studio 2012编译器&#xff09; 一、多态引入 1、对象的类型&#xff1a; &#xff08;1&#xff09; 静态的类型&#xff1a;对象声明时的类型&#xff0c;在编译的时候确定 &#xff08;2&#xff09; 动态的类型&…

C++调用约定

<div class"markdown_views"><p>有一定C开发经验的人一定对”__cdecl、__stdcall、__fastcall”肯定不陌生吧&#xff01;但你真正理解了吗&#xff1f;是的&#xff0c;我曾在这采了无数个坑&#xff0c;栽了无数个跟头&#xff0c;终于忍无可忍要把它总…

C++动态绑定及返回类型协变

C多态之动态绑定&#xff1a; 1、概念&#xff1a;在程序执行期间(非编译期)判断所引用对象的实际类型&#xff0c;根据其实际类型调用相应的方法。 使用virtual关键字修饰类的成员函数时&#xff0c;指明该函数为虚函数&#xff0c;派生类需要重新实现&#xff0c;编译器将实…

使用ucontext组件实现的coroutine代码分析

coroutine一般翻译过来就是协程&#xff0c;类似于线程可以切换&#xff0c;而跟线程是由操作系统调度器来实现切换不一样&#xff0c;协程由用户程序自己调度进行切换。我以前也看过协程相关的内容&#xff0c;但没有自己去实现过。最近搞OpenStack&#xff0c;OpenStack各个模…

C++模板剖析:函数模板、类模板解析

C中关于模板&泛型编程问题&#xff1a; 问题引入&#xff1a;何编写一个通用加法函数&#xff1f; &#xff08;1&#xff09;使用函数重载&#xff0c;针对每个所需相同行为的不同类型重新实现它 int Add(const int &_iLeft, const int&_iRight) { return (_iL…

Android Studio 1.1的安装和遇到的坑

Google的Android Studio 出1.0稳定版本也有很久的时间了&#xff0c;一直喜欢Jetbrains公司的IDE&#xff0c;不同语言的IDE操作习惯都比较统一。 而Android Studio 是基于IntelliJ IDEA的社区版开发的 &#xff0c;怎么也要尝尝鲜才行。 今天安装了下&#xff0c;被几个小坑卡…

BestCoder Round #39 解题报告

现场只做出前三题w 不过不管怎样这既是第一次认真打BC 又是第一次体验用在线编译器调代码 订正最后一题花了今天一整个下午&#xff08;呜呜 收获还是比较大的^_^ Delete wld有n个数(a1,a2,...,an)&#xff0c;他希望进行k次删除一个数的操作&#xff0c;使得最后剩下的n−k个数…

linux :vim 实现命令行下输出进度条

1、 进度条原理&#xff1a; 进度条的的动态增长是利用人的视觉短暂停留效果的&#xff0c;不断从输出缓冲区刷新出相同的内容&#xff0c;在肉眼看来进度条在不断的增长。 在显示器上先输出[# ][%1] 刷新一次之后&#xff0c; …

***jquery选择器 之 获取父级元素、同级元素、子元素

一、获取父级元素1、 parent([expr]): 获取指定元素的所有父级元素 <div id"par_div"><a id"href_fir" href"#">href_fir</a><a id"href_sec" href"#">href_sec</a><a id"href_thr&q…

Sql Server字符串函数

字符串函数用于对字符和二进制字符进行各种操作 1.ASCII()函数 ASCII(character_expression)函数用于返回字符串表达式中最左侧的ASCII代码值。参数character_expression必须是一个char或varchar类型的字符串表达式。 eg: select ASCII(s),ASCII(sql),ASCII(1);执行结果如图:字…

linux 编辑器vim配置

1、 基本配置 对vim进行配置的目的&#xff1a; 进行vim配置&#xff0c;可以让我们在后续敲代码更加方便。按F5可以直接编译并执行C、C代码以及执行shell脚本&#xff1b;按“F8”可进行C、C代码的调试&#xff1b;“Ctrl A”为全选并复制快捷键&#xff0c;方便复…

centos 7上ambari安装试用

2019独角兽企业重金招聘Python工程师标准>>> 1、有三台centos7&#xff0c;名字分别是ws11.localdomain, ws12.localdomain, ws13.localdomain。配置epel源(安装epel-release)。 2、配置root用户ssh无密码访问。 3、安装ntp对时服务。 4、关闭防火墙。centos7下使…

进程管理—进程描述符(task_struct)

本文章转载自&#xff1a;http://blog.csdn.net/qq_26768741/article/details/54348586?locationNum4&fps1 前言 当把一个程序加载到内存当中&#xff0c;此时&#xff0c;这个时候就有了进程&#xff0c;关于进程&#xff0c;有一个相关的叫做进程控制块&#xff08;PCB&…

如何使用emacs编写c语言程序,并编译运行

vi和emacs被分别被称为编辑器之神和神之编辑器。vi的入门精通都很难&#xff0c;emacs入门容易&#xff0c;精通难&#xff1b;vi使用起来不停地切换模式&#xff0c;而emacs则不停地ctrl&#xff0c;meta等组合键。因此&#xff0c;高德纳大师说操作Emacs&#xff0c;就像弹奏…

操作系统中常见的进程调度算法

一、调度与调度算法 调度&#xff1a;操作系统管理了系统的有限资源&#xff0c;当有多个进程&#xff08;或多个进程发出的请求&#xff09;要使用这些资源时&#xff0c;因为资源的有限性&#xff0c;必须按照一定的原则选择进程&#xff08;请求&#xff09;来占用资源。这…

粘滞位 File文件内容

t权限&#xff08;粘滞位)&#xff1a; 是‘不可删除’权限&#xff0c;就是说即使某用户拥有这个文件的rwx权限&#xff0c;可以随意修改文件内容&#xff0c;但是就是不能删除&#xff0c;甚至不能修改文件名&#xff0c;只有root才行。t权限也可以直接用 chmod ot/at fil…