题目链接:点击打开链接
题目大意:在一个 100*100 坐标 以及 中心原点(起点)在(0,0)位置并且半径为 7.5 的圆形上,附近有很多的鳄鱼(可以跳到上面去),问是否可以跳到坐标外(包含边界)。
解题思路:第一跳需要特殊处理,接下来就DFS判断该坐标点是否可以跳出成功,或继续DFS下一个可跳的点。
AC 代码
#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a)
#define ssclr(ss) ss.clear(), ss.str("")
#define INF 0x3f3f3f3f
#define MOD 1000000007
using namespace std;
typedef long long ll;
struct node
{
double x,y;
int vis;
};
node ori;
vector<node> vnd;
int n;
double d;
double fdis(node a, node b)
{
return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2));
}
void dfs(int i)
{
vnd[i].vis=1;
if(50-abs(vnd[i].x)<=d || 50-abs(vnd[i].y)<=d)
{
puts("Yes");
exit(0);
}
for(int j=0;j<n;j++)
if(!vnd[j].vis && fdis(vnd[j],vnd[i])<=d) dfs(j);
}
int main()
{
node nd;
vector<int> vid;
scanf("%d%lf",&n,&d);
for(int i=0;i<n;i++)
{
scanf("%lf%lf",&nd.x,&nd.y);
nd.vis=0;
vnd.push_back(nd);
}
if(7.5+d>=50)
{
puts("Yes");
return 0;
}
for(int i=0;i<n;i++)
if(fdis(vnd[i],ori)<=d+7.5) vid.push_back(i);
for(int i=0;i<vid.size();i++)
if(!vnd[vid[i]].vis) dfs(vid[i]);
puts("No");
return 0;
}