链接:http://acm.hdu.edu.cn/showproblem.php?pid=1086
You can Solve a Geometry Problem too
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7167 Accepted Submission(s): 3480
Problem Description
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.
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.
Input
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.
A test case starting with 0 terminates the input and this test case is not to be processed.
Output
For each case, print the number of intersections, and one line one case.
Sample Input
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
Sample Output
1
3
Author
lcy
//////////////////////////////////////////////////////////////////////////////直接上的模板解决的,不知是喜是忧啊

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <iostream> #include <algorithm> using namespace std; const int MAX=110; const double eps = 1e-6; struct point { double x,y; }; struct beline { point a,b; }; point p[MAX]; int n=0; bool dy(double x,double y) { return x>y+eps; } bool xy(double x,double y) { return x<y-eps; } bool dyd(double x,double y) { return x > y - eps; } bool xyd(double x,double y) { return x<y+eps; } bool dd(double x,double y) { return fabs(x-y) < eps; } double crossProduct(point a,point b,point c) { return (c.x - a.x)*(b.y-a.y)-(b.x-a.x)*(c.y-a.y); } bool onSegment(point a,point b,point c) { double maxx=max(a.x,b.x); double maxy=max(a.y,b.y); double minx=min(a.x,b.x); double miny=min(a.y,b.y); if(dd(crossProduct(a,b,c),0.0)&&dyd(c.x,minx)&&xyd(c.x,maxx)&&dyd(c.y,miny)&&xyd(c.y,maxy)) return true; return false; } bool segIntersect(point p1,point p2,point p3,point p4) { double d1 = crossProduct(p3,p4,p1); double d2 = crossProduct(p3,p4,p2); double d3 = crossProduct(p1,p2,p3); double d4 = crossProduct(p1,p2,p4); if(xy(d1 * d2,0.0)&&xy(d3*d4,0.0)) return true; if(dd(d1,0.0)&&onSegment(p3,p4,p1)) return true; if(dd(d2,0.0)&&onSegment(p3,p4,p2)) return true; if(dd(d3,0.0)&&onSegment(p1,p2,p3)) return true; if(dd(d4,0.0)&&onSegment(p1,p2,p4)) return true; return false; } int main() { int cas,i,j; while(scanf("%d",&cas)!=EOF&&cas!=0) { beline L[MAX]; n=0; for(i=0;i<cas;i++) { scanf("%lf%lf%lf%lf",&L[i].a.x,&L[i].a.y,&L[i].b.x,&L[i].b.y); } for(i=0;i<cas;i++) { for(j=i+1;j<cas;j++) if(segIntersect(L[i].a,L[i].b,L[j].a,L[j].b)) { n++; } } printf("%d\n",n); } return 0; }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· 一个基于 .NET 开源免费的异地组网和内网穿透工具
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单