E. 木头人足球赛
题目描述
木头人星的行动速度是地球上乌龟的 1/10 (所以可以忽略移动的速度),可是他们也热爱运动,尤其是足球。 他们的足球规则跟人类的一样,足球场尺寸为标准 105 * 68,两队各 11 名球员参赛。 假设 Mays 队的每个队员都是专业的球员,踢球都特别准。而她们的对手 Luke 队截球的规律是,如果行进的球离自己的距离不超过 d ,就可以截球成功。 现在 Mays 队的十号球员拿到了球,如果只允许一次射门,Mays 队能不能进球呢? 足球场在 xy 平面内,(0,0)至(105,68)矩形范围内,边缘与 x,y 轴平行且不能站人。其中Luke队的球门为(0, 30)-(0, 38),Mays 队的球门为(105,30)-(105, 38)
输入格式
第一行为组数 T ,对这 T 组数据,每组第一行是Mays队十号球员的坐标 x0,y0 ,接下来 11 行为 Luke 队的 1 - 11 号队员的属性 xi,yi,di , 其中 xi,yi 表示 i 号球员的坐标, di 表示 i 号球员截球能力值。 保证所有坐标不重复且都在球场范围内, x,y 为整数, d 为正实数 1.0≤d≤3.0 。
输出格式
每组数据一行,如果 Mays 队10号队员直接可以射门得分,则输出“Shoot!”;如果10号队员不能成功射门,输出"Poor Mays!".
输入样例
1
104 34
1 24 2.928
48 25 2.605
15 41 1.312
39 42 2.454
3 12 2.080
18 39 1.564
10 36 2.530
97 13 1.589
101 57 1.844
84 39 2.561
0 33 1.831
输出样例
Shoot!
计算几何,判断射门,就是先求出人到球门上下的角度,然后求出所有防守球员的防守角度,取区间交。
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#define pi acos(-1.0)
#define eps 1e-8
using namespace std;
int tot,sig,num,t,c,ans[11],rec[11];
double d,high,low,up,down,alpha,beta,ang1,ang2;
struct pt1{double x,y;
pt1(){}
pt1(double x,double y):x(x),y(y){}
}a,ps,tst[11];
struct pt2{double x,y,d;}b[11];
struct field{double h,l;
field(){}
field(double h,double l):h(h),l(l){}
}seg[20];
int cmp(field a,field b){return a.l<b.l;}
double dist(pt1 p1,pt1 p2){return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));}
void cal_po_cir_angl(pt1 tmp,pt1 ps,double r){
if(tmp.y>=ps.y){
d=dist(tmp,ps);
alpha=asin(r/d),beta=asin((tmp.y-ps.y)/d);
ang1=alpha/pi*180;ang2=beta/pi*180;
up=ang1+ang2;
down=up-2*ang1;
}else{
d=dist(tmp,ps);
alpha=asin(r/d),beta=asin((ps.y-tmp.y)/d);
ang1=alpha/pi*180;ang2=beta/pi*180;
down=-ang1-ang2;
up=down+2*ang1;
}
}
void cal_h_l(pt1 ps){
if(ps.y>38){
low=-atan((ps.y-30)/ps.x)/pi*180;
high=-atan((ps.y-38)/ps.x)/pi*180;
}else if(ps.y<=38&&ps.y>=30){
high=atan((38-ps.y)/ps.x)/pi*180;
low=-atan((ps.y-30)/ps.x)/pi*180;
}else if(ps.y<30){
high=atan((38-ps.y)/ps.x)/pi*180;
low=atan((30-ps.y)/ps.x)/pi*180;
}
}
int main(){
int i,j,k;
for(scanf("%d",&t);t--;){
sig=0;
scanf("%lf%lf",&a.x,&a.y);
for(i=0;i<11;i++)
scanf("%lf%lf%lf",&b[i].x,&b[i].y,&b[i].d);
ps=pt1(a.x,a.y);
cal_h_l(ps);
memset(seg,0,sizeof(seg));
int cnt=0;
for(i=0;i<11;i++){
if(b[i].x>=ps.x)continue;
pt1 tmp=pt1(b[i].x,b[i].y);
cal_po_cir_angl(tmp,ps,b[i].d);
if(up<low||down>high)continue;
seg[cnt++]=field(up,down);
}
sort(seg,seg+cnt,cmp);
if(low<seg[0].l)sig=1;
if(sig==1){printf("Shoot!\n");continue;}
double Maxh=seg[0].h;
for(i=1;i<cnt;i++){
if(seg[i].l>Maxh){sig=1;break;}
else if(seg[i].h>Maxh)Maxh=seg[i].h;
}
if(high>Maxh)sig=1;
if(sig==1){printf("Shoot!\n");continue;}
printf("Poor Mays!\n");
}
return 0;
}