典型的dfs,根据视频里的想法来写
关键点:1、第一跳要单独判断(firstjump)
2、因为题目要求的是求是否能到岸上,所以一旦可以到岸上,就停止dfs
代码:# include# include # include 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("Yesn"); break; } } } if (answer==0) { printf("Non"); } return 0; }



