题目链接
前言:
典型的dfs,根据视频里的想法来写
关键点:
1、第一跳要单独判断(firstjump)
2、因为题目要求的是求是否能到岸上,所以一旦可以到岸上,就停止dfs
代码:
# include <stdio.h>
# include <stdlib.h>
# include <math.h>
int n, d;
int g[200][3];
int visited[200];
int answer;
int firstjump(int x)
{
double ju = sqrt(g[x][1]*g[x][1]+g[x][2]*g[x][2]);
if (ju<=7.5+d)
return 1;
else
return 0;
}
int issave(int x)
{
if ((g[x][1]-d<=-50)||(g[x][1]+d)>=50||(g[x][2]-d<=-50)||(g[x][2]+d)>=50)
return 1;
else
return 0;
}
int jump(int x, int y)
{
double ju = sqrt((g[x][1]-g[y][1])*(g[x][1]-g[y][1])+(g[x][2]-g[y][2])*(g[x][2]-g[y][2]));
if (ju<=d)
return 1;
else
return 0;
}
int DFS(int x)
{
visited[x] = 1;
if (issave(x))
answer = 1;
else
{
for (int i=1; i<=n; i++)
{
if (!visited[i]&&jump(x, i))
{
answer = DFS(i);
if (answer==1)
break;
}
}
}
return answer;
}
int main()
{
scanf("%d%d", &n, &d);
for (int i=1; i<=n; i++)
{
scanf("%d%d", &g[i][1], &g[i][2]);
}
for (int i=1; i<=n; i++)
{
if (!visited[i]&&firstjump(i))
{
answer = DFS(i);
if (answer == 1)
{
printf("Yes\n");
break;
}
}
}
if (answer==0)
{
printf("No\n");
}
return 0;
}