06-图2 Saving James Bond – Easy Version(c/c++)

  • Post author:
  • Post category:其他


在这里插入图片描述

这一次让我们来考虑一下电影《生死关头》中的情况,在这部电影中,世界上最著名的间谍詹姆斯·邦德被一群毒贩抓获。他被送到一个湖泊中心的一小块土地上,四周有很多鳄鱼。在那里,他采取了最大胆的行动逃跑——他跳到离他最近的鳄鱼的头上!在鳄鱼意识到发生了什么之前,詹姆斯又跳到另一个大脑袋上……最后,他在最后一条鳄鱼咬他之前到达了岸边(实际上,特技演员被鳄鱼的大嘴抓住了,因为他的厚靴子差点没能逃脱)。

假设这个湖是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;
}  



版权声明:本文为qq_38929220原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。