题目:
You can Solve a Geometry Problem too
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6456 Accepted Submission(s): 3116
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
代码:
#include<stdio.h>
struct line
{
float x1,x2,y1,y2,k;
};
bool judge(line l1,line l2)
{
float b;
b=((l1.y1+l1.y2)-l1.k*(l1.x1+l1.x2))/2;
if((l2.x1*l1.k+b-l2.y1)*(l2.x2*l1.k+b-l2.y2)<=0)
return true;
else
return false;
}
void main()
{
float x1,y1,x2,y2;
int n,i,j,count;
line l[100];
while(1)
{
scanf("%d",&n);
if(n==0)
break;
for(i=0;i<n;i++)
{
scanf("%f %f %f %f",&l[i].x1,&l[i].y1,&l[i].x2,&l[i].y2);
l[i].k=(l[i].y2-l[i].y1)/(l[i].x2-l[i].x1);
}
count=0;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if(judge(l[i],l[j])&&judge(l[j],l[i]))
count++;
}
printf("%d\n",count);
}
}
本文探讨了如何解决ACM/ICPC中常见的几何问题,并分享了解题技巧和经验。通过实例分析,展示了如何高效计算多个线段间的交点数量,适合初学者和竞赛准备者的参考。
2353

被折叠的 条评论
为什么被折叠?



