06-图2 Saving James Bond - Easy Version (25 分)

#include <iostream>
#include <cmath>
using namespace std;

const double island_radius = 15.0 / 2;//孤岛半径
const double square_size = 100.0;//湖的大小(正方形)
const int N = 110;//鳄鱼最大个数

typedef struct Point
{
	int x;
	int y;
	bool visited;
}Position;
Position P[N];
int n; double d;

bool FirstJump(int V) {
	return sqrt(pow(P[V].x, 2) + pow(P[V].y, 2))- island_radius <=d;//返回true 即可以跳出去
}
bool IsSave(int V) {
	return ((abs(P[V].x) + d >= square_size/2.0) || (abs(P[V].y) + d >= square_size / 2.0));
}
bool Jump(int v1, int v2) {
	return sqrt(pow(P[v1].x - P[v2].x, 2) + pow(P[v1].y - P[v2].y, 2))  <= d;
}
bool DFS(int V) {
	P[V].visited = true;
	bool answer = false;
	if (IsSave(V))
	{
		return true;//递归调用的停止条件
	}
	for (int i = 0; i < n; i++)
	{
		if (!P[i].visited  && Jump(V,i))
		{
			answer = DFS(i);
		}
		if (answer)
		{
			break;
		}
	}
	return answer;
}
void save007() {
	bool IsSave = false;
	for (int i = 0; i < n; i++)//遍历所有的鳄鱼 寻找能第一跳的那一条
	{
		if (!P[i].visited  && FirstJump(i))
		{
			IsSave = DFS(i);
			if (IsSave)
			{
				break;
			}
		}
	}
	if (IsSave)
	{
		cout << "Yes" << endl;
	}
	else
	{
		cout << "No" << endl;
	}
}



int main() {
	cin >> n >> d;
	for (int i = 0; i < n; i++)
	{
		cin >> P[i].x >> P[i].y;
		P[i].visited = false;
	}
	save007();
	
	system("pause");
	return 0;
}

1.代码根据陈越姥姥讲的改编而成;
2.几个测试点出错:原因是FirstJump函数进行距离判断的时候,横纵坐标都写成了P[V].x了;
3.解题思路:由于孤岛具有半径,第一跳需要做特殊判断;第一跳选择到了合适的落脚鳄鱼点之后,通过调用DFS继续寻找下一步落脚鳄鱼点;寻找落脚鳄鱼点不是目的,目的是是否能跳到岸边,因此每次进行DFS寻找下个落脚点之前,要判断是否可以获救;DFS的方法就是一直走到头,一直走到岸边或者不能跳的时候再返回。如有合适的方案,则输出Yes

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值