#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