7-1 拯救007
分数 25
在老电影“007之生死关头”(Live and Let Die)中有一个情节,007被毒贩抓到一个鳄鱼池中心的小岛上,他用了一种极为大胆的方法逃脱 —— 直接踩着池子里一系列鳄鱼的大脑袋跳上岸去!(据说当年替身演员被最后一条鳄鱼咬住了脚,幸好穿的是特别加厚的靴子才逃过一劫。)
设鳄鱼池是长宽为100米的方形,中心坐标为 (0, 0),且东北角坐标为 (50, 50)。池心岛是以 (0, 0) 为圆心、直径15米的圆。给定池中分布的鳄鱼的坐标、以及007一次能跳跃的最大距离,你需要告诉他是否有可能逃出生天。
输入格式:
首先第一行给出两个正整数:鳄鱼数量 N(≤100)和007一次能跳跃的最大距离 D。随后 N 行,每行给出一条鳄鱼的 (x,y) 坐标。注意:不会有两条鳄鱼待在同一个点上。
输出格式:
如果007有可能逃脱,就在一行中输出"Yes",否则输出"No"。
输入样例 1:
14 20 25 -15 -25 28 8 49 29 15 -35 -2 5 28 27 -29 -8 -28 -20 -35 -25 -20 -13 29 -30 15 -35 40 12 12
输出样例 1:
Yes
输入样例 2:
4 13 -12 12 12 12 -12 -12 12 -12
输出样例 2:
No
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<stdio.h>
#include<math.h>
int graph[101][101],f=0,a[101];
int pand(int n,int m,int x1,int y1,int x2,int y2,int d){if((sqrt(x1*x1+y1*y1)-15<=d)) graph[0][n]=1;if((sqrt(x2*x2+y2*y2)-15<=d)) graph[0][m]=1;if((50-fabs(x1)<=d)||(50-fabs(y1)<=d)) a[n]=1;if((50-fabs(x2)<=d)||(50-fabs(x2)<=d)) a[m]=1;return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)<=d*d;
}
void dfs(int n,int g){if(a[g]==1) f=1;for(int i=1;i<=n;i++)if(graph[g][i]==1){graph[g][i]=0;dfs(n,i);}
}
int main(){int n,k,i,j;scanf("%d %d",&n,&k);int x[n+1],y[n+1];for(i=1;i<=n;i++) scanf("%d %d",&x[i],&y[i]);for(i=1;i<=n;i++) for(j=i;j<=n;j++)graph[i][j]=graph[j][i]=pand(i,j,x[i],y[i],x[j],y[j],k);dfs(n,0);if(f||k>=35) printf("Yes\n");else printf("No\n");return 0;
}