极其简单的BFS遍历,判断好边界条件即可(相较于DFS我更擅长于BFS)
#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
int ABS(int a){
if(a>0)return a;
else return -a;
}
struct node{
int x;
int y;
int vis;
}pos[105];
queue<struct node>q;
int main(){
int N,D;
int r=7.5;
int cnt=0;
scanf("%d %d",&N,&D);
while(N--){
scanf("%d %d",&pos[cnt].x,&pos[cnt].y);
pos[cnt++].vis=0;
}
for(int i=0;i<cnt;i++){
if(sqrt(pos[i].x*pos[i].x+pos[i].y*pos[i].y)-r<=D){
q.push(pos[i]);
pos[i].vis=1;
}
}
int flag=0;
while(!q.empty()){
struct node t=q.front();
if(t.x+D>=50||t.x-D<=-50||t.y+D>=50||t.y-D<=-50){
flag=1;
break;
}
for(int i=0;i<cnt;i++){
if(!pos[i].vis && sqrt(pow(ABS(pos[i].x-t.x),2)+pow(ABS(pos[i].y-t.y),2))<=D){
q.push(pos[i]);
pos[i].vis=1;
}
}
q.pop();
}
if(flag)printf("Yes");
else printf("No");
}