HDU2948Geometry Darts(简单计算几何)

题目大意就是说两个人掷飞镖,飞镖在所给定的图形内就记一分,现在给定N个图形(圆、三角形和矩形),问每一次比赛(没人分别掷三次)谁赢。


  1 #include <map>
2 #include <set>
3 #include <stack>
4 #include <queue>
5 #include <cmath>
6 #include <ctime>
7 #include <vector>
8 #include <cstdio>
9 #include <cctype>
10 #include <cstring>
11 #include <cstdlib>
12 #include <iostream>
13 #include <algorithm>
14 using namespace std;
15 #define eps 1e-12
16 #define MAXN 55
17 #define INF 1e30
18 #define mem0(a) memset(a,0, sizeof(a))
19 #define mem1(a) memset(a,-1,sizeof(a))
20 double MAX(double a, double b) {return a > b ? a : b;}
21 double MIn(double a, double b) {return a < b ? a : b;}
22 typedef long long LL;
23 /****************************************计算几何头文件**************************************************/
24 struct Point{
25 double x,y;
26 Point(double x=0, double y=0):x(x),y(y){}
27 };
28
29 struct Polygon
30 {
31 Point p[MAXN];
32 int Size;
33 };
34
35 struct Circle
36 {
37 Point o;
38 double r;
39 Circle(){}
40 Circle(Point _o, double _r):o(_o),r(_r){}
41 };
42
43 Point operator + (Point A, Point B) {return Point(A.x+B.x, A.y+B.y);}
44
45 Point operator - (Point A, Point B) {return Point(A.x-B.x, A.y-B.y);}
46
47 Point operator * (Point A, double p) {return Point(A.x*p, A.y*p);}
48
49 Point operator / (Point A, double p) {return Point(A.x/p, A.y/p);}
50
51 int dcmp(double x) {
52 if(fabs(x) < eps) return 0;
53 else return x < 0 ? -1 : 1;
54 }
55
56 bool operator == (const Point &A, const Point &B) {
57 return dcmp(A.x-B.x) == 0 && dcmp(A.y-B.y) == 0;
58 }
59
60 double Dot(Point A, Point B) { return A.x*B.x + B.y*B.y;} //点积
61
62 double Length(Point A) { return sqrt(Dot(A,A));} //向量长度
63
64 double Angle(Point A, Point B) {return acos(Dot(A,B) / Length(A) / Length(B));}//向量夹角
65
66 double cross(Point A, Point B) {return A.x*B.y - A.y*B.x;}
67
68 bool crossed(Point a, Point b, Point c, Point d)//线段ab和cd是否相交
69 {
70 if(cross(a-c, d-c)*cross(b-c, d-c)<=0 && cross(c-a, b-a)*cross(d-a, b-a)<=0)
71 {
72 return true;
73 }
74 return false;
75 }
76
77 bool isPointOnSegent(Point p, Point s, Point e)//判断点是否在线段se上
78 {
79 double d = (p.x-s.x) * (e.x-p.x);
80 double a = (p.y-s.y) / (p.x-s.x);
81 double b = (e.y-p.y) / (e.x-p.x);
82 if(dcmp(d)==1 && dcmp(a-b)==0)return true;
83 return false;
84 }
85
86 int isPointInPolygon(Point p, Polygon poly)//判断点是否在多边形以内
87 {
88 int w = 0;
89 int n = poly.Size;
90 for(int i=0;i<n;i++)
91 {
92 if(isPointOnSegent(p, poly.p[i], poly.p[(i+1)%n])) return 1;//点在边上
93 int k = dcmp(cross(poly.p[(i+1)%n]-poly.p[i], p-poly.p[i]));
94 int d1 = dcmp(poly.p[i].y - p.y);
95 int d2 = dcmp(poly.p[(i+1)%n].y - p.y);
96 if(k > 0 && d1 <= 0 && d2 > 0) w++;
97 if(k < 0 && d2 <= 0 && d1 > 0) w--;
98 }
99 if(w != 0) return 1;
100 return 0;
101 }
102
103 /****************************************************************************************************/
104 struct R
105 {
106 Point a, b;
107 R(){}
108 R(Point _a, Point _b)
109 {
110 a = _a;
111 b = _b;
112 }
113 }r[1001];
114 struct T
115 {
116 Point a, b, c;
117 T(){}
118 T(Point _a, Point _b, Point _c) {
119 a = _a; b = _b; c = _c;
120 }
121 }t[1001];
122 Circle c[1001];
123 int S, N;
124 int cntC = 0, cntT = 0, cntR = 0;
125
126 int calc(double x, double y)//计算点(x, y)在图中的多少个图形内部
127 {
128 Point p = Point(x, y);
129 int ans = 0;
130 for(int i=0;i<cntC;i++)
131 {
132 if(Length(p-c[i].o) <= c[i].r) ans ++;
133 }
134 for(int i=0;i<cntT;i++)
135 {
136 if( cross(t[i].c-t[i].a, p-t[i].a)*cross(t[i].b-t[i].a, p-t[i].a)<=0
137 && cross(t[i].a-t[i].b, p-t[i].b)*cross(t[i].c-t[i].b, p-t[i].b)<=0 ) ans ++;
138 }
139 for(int i=0;i<cntR;i++)
140 {
141 if(x>=r[i].a.x&&x<=r[i].b.x && y>=r[i].a.y&&y<=r[i].b.y) ans ++;
142 }
143 return ans;
144 }
145
146 int main()
147 {
148 char ch;double x, y, rr;
149 while(~scanf("%d%*c", &S))
150 {
151 cntT = cntC = cntR = 0;
152 for(int i=0;i<S;i++)
153 {
154 scanf("%c", &ch);
155 if(ch == ‘C‘)
156 {
157 scanf("%lf %lf %lf%*c", &x, &y, &rr);
158 c[cntC++] = Circle(Point(x, y), rr);
159 continue;
160 }
161 else if(ch == ‘T‘)
162 {
163 Point aa[3];
164 for(int j=0;j<3;j++)
165 {
166 scanf("%lf%*c%lf%*c", &x, &y);
167 aa[j] = Point(x, y);
168 }
169 t[cntT++] = T(aa[0],aa[1],aa[2]);
170 }
171 else
172 {
173 Point aa[2];
174 for(int j=0;j<2;j++)
175 {
176 scanf("%lf%*c%lf%*c", &x, &y);
177 aa[j] = Point(x, y);
178 }
179 r[cntR++] = R(aa[0], aa[1]);
180 }
181 }
182 scanf("%d", &N);
183 for(int i=0;i<N;i++)
184 {
185 int cntA = 0, cntB = 0;
186 for(int j=0;j<3;j++)
187 {
188 scanf("%lf %lf", &x, &y);
189 cntA += calc(x, y);
190 }
191 for(int j=0;j<3;j++)
192 {
193 scanf("%lf %lf", &x, &y);
194 cntB += calc(x, y);
195 }
196 // printf("%d %d\n", cntA, cntB);
197 printf("%s\n", cntA > cntB ? "Bob" : (cntA == cntB ? "Tied" : "Hannah"));
198 }
199 }
200 return 0;
201 }

时间: 2024-10-09 19:01:17

HDU2948Geometry Darts(简单计算几何)的相关文章

[HDU 4082] Hou Yi&#39;s secret (简单计算几何)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4082 题目大意: 给你n个点,问能最多构成多少个相似三角形. 用余弦定理,计算三个角度,然后暴力数有多少个,更新答案. 代码: 1 #include <cstdio> 2 #include <cmath> 3 #include <algorithm> 4 #include <cstring> 5 #include <vector> 6 #includ

POJ 1556 The Doors(简单计算几何+最短路)

●赘述题目 10*10的房间内,有竖着的一些墙(不超过18个).问从点(0,5)到(10,5)的最短路. 按照输入样例,输入的连续5个数,x,y1,y2,y3,y4,表示(x,0--y1),(x,y2--y3),(x,y4--10)是墙壁. ●题解 方法:建图(用到简单计算几何)+最短路 ○记录下每个端点. ○包含起点,终点,以及每个墙的可以走的端点,如下图: ○然后枚举点,尝试两两组合连(线段)边,若该线不会撞在墙上,即不会与墙壁线段相交,就add_adge(). 效果图如下: 如何判断呢?

cf13B Letter A(分类+简单计算几何,,)

题意: 给三个线段(每个线段的两个端点的坐标),问这三个线段能否组成字母A. 组成字母A的条件: 1.两个线段有公共端点. 2.这两个线段夹角小于等于90度. 3.第三个线段的两个端点分别在这两个线段上,且各自分割的大小比率不超过4:1 思路: 直接..... 应该开始积累计算几何的代码了,,,, 代码: struct Point{ double x,y; }; struct segment{ Point a,b; } S[5]; bool samePoint(Point a,Point b){

Gym 101917 E 简单计算几何,I 最大流

题目链接 https://codeforces.com/gym/101917 E 题意:给定一个多边形(n个点),然后逆时针旋转A度,然后对多边形进行规约,每个点的x规约到[0,w]范围内,y规约到[0,h]范围内,输出规约后的结果. 解析:求出来 多边形的长和宽,再和w,h比较,对点按比例进行缩放就好了. (多边形旋转其实是绕给出的第一个点旋转,以为是绕原点wa了1发). AC代码 1 #include <bits/stdc++.h> 2 #define Vector Point 3 usi

zoj3728_Collision(简单计算几何)

/////////////////////////////////////////////////////////////////////////////////////////////////////// 作者:tt2767 声明:本文遵循以下协议自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 查看本文更新与讨论请点击:http://blog.csdn.net/tt2767 链接被删请百度: CSDN tt2767 ///////////////

UVA - 10250 - The Other Two Trees (简单计算几何)

UVA - 10250 The Other Two Trees Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description Problem E The Other Two Trees Input: standard input Output: standard output Time Limit: 2 seconds You have a quadrilateral

HDU 4793 Collision (2013长沙现场赛,简单计算几何)

Collision Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 685    Accepted Submission(s): 248Special Judge Problem Description There's a round medal fixed on an ideal smooth table, Fancy is tryin

poj 1687 Buggy Sat 简单计算几何

暑期集训出的第一道一血 感觉自己萌萌哒…… 这道题本身并没有坑点 仅仅是翻译巨坑…… 解大腿在做B 安学长在做E 我闲着也没事 就一个词一个词翻译F…… 最后感觉…… 题干大多数都看不懂…… 也都没啥用…… 大概呢…… 就是给你n个点…… m条回路…… 问你哪条回路是最外面的…… 总之最后就是让你求哪个回路组成的图形面积最大…… 考点就是多边形面积公式…… 怕有误差就没加/2…… 好像加了也能过吧…… WA了两次 一次是选错点了 一次是第一个点和最后一个点顺序反了…… 1 #include<st

hihoCoder - 1040 - 矩形判断 (简单计算几何~)

#1040 : 矩形判断 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形. 输入 输入第一行是一个整数T(1<=T<=100),代表测试数据的数量. 每组数据包含4行,每行包含4个整数x1, y1, x2, y2 (0 <= x1, y1, x2, y2 <= 100000):其中(x1, y1), (x2,y2)代表一条线段的两个端点. 输出 每组数据输出一行YES或者NO,表示输入的