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 }