HDu 1086 You can Solve a Geometry Problem too(2つのセグメントが交差しているかどうかを判断)
4382 ワード
You can Solve a Geometry Problem too
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9195 Accepted Submission(s): 4498
Problem Description
Many geometry(幾何学)problems were designed in the ACM/ICCC.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.
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.
Output
For each case, print the number of intersections, and one line one case.
Sample Input
解析:http://dev.gameres.com/Program/Abstract/Geometry.htm#判断两线段是否相交
需要注意的是,在做跨立实验的时候,需要同时满足 L1的两个端点在L2两端,L2的两个端点在 L1 两端。
比如这组数据:
2
-1.00 0.00 1.00 1.00
1.0 0.0 2.0 0.0
代码:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9195 Accepted Submission(s): 4498
Problem Description
Many geometry(幾何学)problems were designed in the ACM/ICCC.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.
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.
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
Recommend
We have carefully selected several similar problems for you: 1115 1392 2108 2150 1348
解析:http://dev.gameres.com/Program/Abstract/Geometry.htm#判断两线段是否相交
需要注意的是,在做跨立实验的时候,需要同时满足 L1的两个端点在L2两端,L2的两个端点在 L1 两端。
比如这组数据:
2
-1.00 0.00 1.00 1.00
1.0 0.0 2.0 0.0
代码:
#include
#include
using namespace std;
const int maxn=1e2;
struct tnode{
double x,y;
}a[maxn*2+10];
bool ok(int i,int j)
{
if(min(a[i].x,a[i+1].x)>max(a[j].x,a[j+1].x))return 0;
if(max(a[i].x,a[i+1].x)max(a[j].y,a[j+1].y))return 0;
if(max(a[i].y,a[i+1].y)0)return 0;
x1=a[i+1].x-a[i].x,y1=a[i+1].y-a[i].y;
x3=a[j+1].x-a[i].x,y3=a[j+1].y-a[i].y;
x2=a[j].x-a[i].x,y2=a[j].y-a[i].y;
return (x1*y2-x2*y1)*(x1*y3-x3*y1)<=0;
}
int main()
{
//freopen("1.in","r",stdin);
int n,i,j,ans;
while(scanf("%d",&n),n)
{
for(n*=2,i=1;i<=n;i++)
scanf("%lf%lf",&a[i].x,&a[i].y);
for(ans=0,i=1;i<=n;i+=2)
for(j=i+2;j<=n;j+=2)ans+=ok(i,j);
printf("%d
",ans);
}
return 0;
}