【HDOJ 1086】 模板水过
2015-07-22 11:12
204 查看
You can Solve a Geometry Problem too
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8693 Accepted Submission(s): 4232
[align=left]Problem Description[/align]
Many geometry(几何)problems were designed in the ACM/ICPC. And now, I also prepare a geometry problem for this final exam. According to the experience of many ACMers, geometry problems are always much trouble, but this problem is very easy, after all we are now attending an exam, not a contest :)
Give you N (1<=N<=100) segments(线段), please output the number of all intersections(交点). You should count repeatedly if M (M>2) segments intersect at the same point.
Note:
You can assume that two segments would not intersect at more than one point.
[align=left]Input[/align]
Input contains multiple test cases. Each test case contains a integer N (1=N<=100) in a line first, and then N lines follow. Each line describes one segment with four float values x1, y1, x2, y2 which are coordinates of the segment’s ending.
A test case starting with 0 terminates the input and this test case is not to be processed.
[align=left]Output[/align]
For each case, print the number of intersections, and one line one case.
[align=left]Sample Input[/align]
2
0.00 0.00 1.00 1.00
0.00 1.00 1.00 0.00
3
0.00 0.00 1.00 1.00
0.00 1.00 1.00 0.000
0.00 0.00 1.00 0.00
0
[align=left]Sample Output[/align]
1
3
[align=left]Author[/align]
lcy
仅仅用到了相交线段模板
#include <iostream> #include <cmath> using namespace std; struct POINT { double x; double y; }; struct LINESEG { POINT s; POINT e; }; double multiply(POINT a,POINT b,POINT c) { return ((b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y)); } bool intersect(LINESEG u,LINESEG v) { return( (max(u.s.x,u.e.x)>=min(v.s.x,v.e.x))&& //排斥实验 (max(v.s.x,v.e.x)>=min(u.s.x,u.e.x))&& (max(u.s.y,u.e.y)>=min(v.s.y,v.e.y))&& (max(v.s.y,v.e.y)>=min(u.s.y,u.e.y))&& (multiply(v.s,u.e,u.s)*multiply(u.e,v.e,u.s)>=0)&& //跨立实验 (multiply(u.s,v.e,v.s)*multiply(v.e,u.e,v.s)>=0)); } int main() { int N; while(cin>>N&&N) { LINESEG A[101]; int count=0; for(int i=0;i<N;i++) { cin>>A[i].s.x>>A[i].s.y>>A[i].e.x>>A[i].e.y; } for(int i=0;i<N;i++) for(int j=0;j<N;j++) if(intersect(A[i],A[j])&&i!=j) count++; cout<<count/2<<endl; } 48 return 0; 49 }
相关文章推荐
- hdu1133 Buy the Ticket (卡兰特数应用+java大数)
- js学习
- 黑马程序员——Java基础-数组、帮助文档
- Lucene 5.2.1 demo
- IOS 7 改版之后 获取 唯一标志符
- 脚本整理
- Android windowSoftInputMode属性详解
- 高斯模糊效果实现方案及性能对比
- 除非必须,否则不用递增递减运算符的后置版本
- 关于安卓的小知识点
- linux采用命令
- Android开源框架:AndroidAnnotations基本介绍
- 小桐学设计模式--策略模式
- lower_bound() + upper_bound()
- HDU 5288 OO’s Sequence (二分)2015多校训练一
- LeetCode|| Single Number II
- 消除input倒三角
- HIVE服务启动与HIVE命令冲突解决办法
- GRE写作必备句型
- poj 3258 River Hopscotch 二分搜索