解题思路:采用DFS算法判断007是否能够逃生,每次先判断是否能够上岸,如若不能上岸再选取下一跳的落脚点,注意到第一跳的半径是D+7.5,而其他跳半径为D
#include <stdio.h> #include <math.h> #include <string.h> int tag=0; int n,d; typedef struct { int x,y; } Index; Index D[1001]; int visit[1001]; int IsSafe(int x) {//判断是否安全上岸 if(D[x],x-d<=-50||D[x].x+d>=50||D[x].y-d<=-50||D[x].y+d>=50) return 1; return 0; } int Jump(int i,int j) {//判断能否跳到下一个鳄鱼脑袋上 int p1=(D[i].x-D[j].x)*(D[i].x-D[j].x); int p2=(D[i].y-D[j].y)*(D[i].y-D[j].y); if(p1+p2<=d*d) return 1 ; return 0; } int FirstJump(int x,int y) {//第一跳 if(pow(x,2)+pow(y,2)<=pow(d+7.5,2)) return 1; return 0; } int DFS(int x) { visit[x]=1; int i; if(IsSafe(x)) { tag=1; return; } else { for(i=0; i<n; i++) { if(!visit[i]&&Jump(x,i)) { DFS(i); } } } } int main() { scanf("%d %d",&n,&d); int i,j; for(i=0; i<n; i++) { scanf("%d %d",&D[i].x,&D[i].y); } if(d>=50) { printf("Yes "); } else { memset(visit,0,sizeof(visit)); for(i=0; i<n; i++) { if(!visit[i]&&FirstJump(D[i].x,D[i].y)) { DFS(i); } } if(!tag) printf("No "); else printf("Yes "); } return 0; }