HDU1086

You can Solve a Geometry Problem too

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8452    Accepted Submission(s):
4125

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.

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

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <stack>
 5 #include <queue>
 6 #include <map>
 7 #include <set>
 8 #include <vector>
 9 #include <math.h>
10 #include <algorithm>
11 using namespace std;
12 const double pi = acos(-1.0);
13 const int INF = 0x3f3f3f3f;
14
15 struct Line
16 {
17     double x1,y1,x2,y2;
18 }node[105];
19
20 bool solve(Line a, Line b)//叉积判断两线段是否相交
21 {
22     if (((a.x1-b.x1)*(a.y2-b.y1)-(a.x2-b.x1)*(a.y1-b.y1))*((a.x1-b.x2)*(a.y2-b.y2)-(a.x2-b.x2)*(a.y1-b.y2))>0)
23     return false;
24     if (((b.x1-a.x1)*(b.y2-a.y1)-(b.x2-a.x1)*(b.y1-a.y1))*((b.x1-a.x2)*(b.y2-a.y2)-(b.x2-a.x2)*(b.y1-a.y2))>0)
25     return false;
26     return true;
27 }
28
29 int main ()
30 {
31     int n;
32     while (scanf ("%d",&n),n)
33     {
34         for (int i=0; i<n; i++)
35         scanf ("%lf%lf%lf%lf",&node[i].x1,&node[i].y1,&node[i].x2,&node[i].y2);
36         int cnt = 0;
37         for (int i=0; i<n; i++)
38         {
39             for (int j=i+1; j<n; j++)
40             {
41                 if (solve(node[i], node[j]))
42                 cnt++;
43             }
44         }
45         printf ("%d\n",cnt);
46     }
47     return 0;
48 }

时间: 2024-10-20 01:41:14

HDU1086的相关文章

HDU1086判断线段相交

HDU1086 You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10924    Accepted Submission(s): 5393 Problem Description Many geometry(几何)problems were designed in

You can Solve a Geometry Problem too (hdu1086)几何,判断两线段相交

You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6837 Accepted Submission(s): 3303 Problem Description Many geometry(几何)problems were designed in the ACM/ICPC. A

hdu1086(线段相交)

题目意思: 给出n个线段,判断这n条线段中,线段相交的对数. http://acm.hdu.edu.cn/showproblem.php?pid=1086 题目分析: 此题主要写出判断线段相交的函数,然后判断每一对线段即可,时间复杂度O(n*n).详细解释见代码. AC代码: /** *判断AB和CD两线段是否有交点: *同时满足两个条件:('x'表示叉积) * 1.C点D点分别在AB的两侧.(向量(ABxAC)*(ABxAD)<=0) * 2.A点和B点分别在CD两侧.(向量(CDxCA)*(

HDU1086 You can Solve a Geometry Problem too(计算几何)

You can Solve a Geometry Problem too                                         Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)                                         Problem Description Many geometry(几何)problems wer

判断两直线是否相交 hdu1086

1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 struct line 7 { 8 double x1; 9 double y1; 10 double x2; 11 double y2; 12 }l[110]; 13 14 bool test(int i,int j) 15 { 16 int s=0; 17 double acd = (l[j].x1-l[i].x1)*(l[j].y1-l

HDU1086 You can Solve a Geometry Problem too(数学几何)

这道题的主要解题思路如下: 第1 步:快速排斥试验,如果分别以P1P2 ,P3P4 为对角线做矩形,而这两个矩形不相交,则这两条线段肯定不相交,如下左图:即使两个矩形相交,这两条线段也不一定相交,如下右图,这时再用第2 步判断: 表示成语句,即两个矩形相交当且仅当下列式子为真: (max(x1,x2)≥min(x3,x4))∧ (max(x3,x4)≥min(x1,x2)) ∧(max(y1,y2)≥min(y3,y4))∧(max(y3,y4)≥min(y1,y2)) 两个矩形相交必须在两个方

hdu1147(Pick-up sticks)

题目意思: 但顺序给出n个小木棍(线段),取走在最顶上的木棍. http://acm.hdu.edu.cn/showproblem.php?pid=1147 题目分析: 仔细想想此题还是判断线段是否相交,只是需要注意顺序,只能判断每个线段(木棍)后面放的木棍.类似于hdu1108. AC代码: /** *判断后面的线段是否与前面的线段相交, *此题还是一个判断线段是否相交的问题, *只是必须注意顺序,判断相交的函数减hdu1086 */ #include<iostream> #include&

计算几何_线段交点的快速排斥_跨立实验

附上题的地址 https://vjudge.net/problem/HDU-1086# // 点是否在矩形 // 矩形点是 st 和 ed bool IsPointInRectangle(Point jpt, Point st, Point ed) { if (min(st.x, ed.x) <= jpt.x && max(st.x, ed.x) >= jpt.x && max(st.y, ed.y) <= jpt.y && max(st.