这一次让我们来考虑一下电影《生死关头》中的情况,在这部电影中,世界上最著名的间谍詹姆斯·邦德被一群毒贩抓获。他被送到一个湖泊中心的一小块土地上,四周有很多鳄鱼。在那里,他采取了最大胆的行动逃跑——他跳到离他最近的鳄鱼的头上!在鳄鱼意识到发生了什么之前,詹姆斯又跳到另一个大脑袋上……最后,他在最后一条鳄鱼咬他之前到达了岸边(实际上,特技演员被鳄鱼的大嘴抓住了,因为他的厚靴子差点没能逃脱)。
假设这个湖是100×100的正方形。假设湖的中心在(0,0),东北角在(50,50)。中心岛是一个以(0,0)为中心的圆盘,直径为15。湖里有许多鳄鱼在不同的位置。根据每条鳄鱼的坐标和詹姆斯能跳的距离,你必须告诉他是否能逃跑。
Input Specification:
每个输入文件包含一个测试用例。每一种情况都是从一行开始,其中包含两个正整数N(≤100),鳄鱼的数量,和D,詹姆斯能跳的最大距离。然后是N行,每一行包含一个鳄鱼的(x,y)位置。注意,没有两条鳄鱼会呆在同一位置。
Output Specification:
对于每个测试用例,如果James可以逃跑,则打印一行“Yes”,如果不能,则打印一行“No”。
Sample Input 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
Sample Output 1:
Yes
Sample Input 2:
4 13
-12 12
12 12
-12 -12
12 -12
Sample Output 2:
No
思路
初始位置在一个半径为7.5的小岛上,设置初始位置为(0,0),每只鳄鱼视作一个点。利用DFS依次计算两点之间的距离,如果小于等于可以跳跃的距离就跳到这条鳄鱼头上,并计算是否可以从次点处跳到岸上。
起跳处视为(0,0)的话第一跳的起跳距离即为D+7.5,要单独拿出来计算
代码
#include<bits/stdc++.h>
#define MAX 101
using namespace std;
typedef struct Crocodile{
double x,y;
int vis;
}Crocodile;
Crocodile pos[MAX];
double dis;
bool flag=false;//判断是否能跳
//深度优先搜索
void DFS(Crocodile seven,int N,int D){
seven.vis=1;
for(int i=0;i<N+1;i++){
dis=sqrt((pos[i].x-seven.x)*(pos[i].x-seven.x)+(pos[i].y-seven.y)*(pos[i].y-seven.y));
if(D>=dis&&pos[i].vis==0){
pos[i].vis=1;
//cout<<pos[i].x<<" "<<pos[i].y<<endl;
if((50-pos[i].x)<=D||(50-pos[i].x)>=(100-D)||(50-pos[i].y)<=D||(50-pos[i].y)>=(100-D)){
flag=true;
break;
}
DFS(pos[i],N,D);
}
}
}
int main(){
int N;
double D;
cin>>N>>D;
for(int i=1;i<N+1;i++){
cin>>pos[i].x>>pos[i].y;
pos[i].vis=0;//初始设置为未被访问
}
pos[0].x=0;//初始位置
pos[0].y=0;
pos[0].vis=0;
for(int i=0;i<N+1;i++){
dis=sqrt((pos[i].x-pos[0].x)*(pos[i].x-pos[0].x)+(pos[i].y-pos[0].y)*(pos[i].y-pos[0].y));
if((D+7.5)>=dis&&pos[i].vis==0){
if((50-pos[i].x)<=D+7.5||(50-pos[i].x)>=(100-D-7.5)||(50-pos[i].y)<=D+7.5||(50-pos[i].y)>=(100-D-7.5)){
flag=true;
break;
}
DFS(pos[i],N,D);
}
}
if(flag){
cout<<"Yes";
}
else{
cout<<"No";
}
return 0;
}