#include<stdio.h> #include<string.h> #define max 1001 struct node { int x; int y; int h; }g[max],temp; int n,r,d,k; int used[max],pre[max],queue[max],num[max]; void bfs() { int front=0,dis,rear=0,i,j,pe,kt,klich; rear++; queue[rear]=0;used[0]=1;pre[0]=0; while(front!=rear) { front++; temp=g[queue[front]]; for(i=1;i<n;i++) { dis=(temp.x-g[i].x)*(temp.x-g[i].x)+(temp.y-g[i].y)*(temp.y-g[i].y); if(dis<=r*r&&used[i]==0&&g[i].h>0) { pre[i]=queue[front]; num[i]=num[queue[front]]+1; used[i]=1; rear++; queue[rear]=i; } } } if(pre[n-1]==-1||k<num[n-1])//不能达到敌方英雄的点 { printf("NO/n/n"); return ; } g[n-1].h-=d;//能到达,敌方英雄首次消耗的能量 if(g[n-1].h<=0)//可以到达,并一次kill; { printf("YES/n/n"); return ; } k-=num[n-1]; pe=n-1; while(pre[pe]!=0)//在走过的路径消耗的k值 { g[pre[pe]].h-=d; if(g[pre[pe]].h<0) g[pre[pe]].h=0; pe=pre[pe]; } kt=0;//在敌方英雄附近消耗的k值 for(i=1;i<n-1;i++) { dis=(g[n-1].x-g[i].x)*(g[n-1].x-g[i].x)+(g[n-1].y-g[i].y)*(g[n-1].y-g[i].y); if(dis<=r*r&&g[i].h>0) { kt+=g[i].h/d; if(g[i].h%d>0) kt++; } } klich=g[n-1].h/d; if(g[n-1].h%d>0) klich++; if(kt>=klich&&k>=(klich*2))//这个点要注意,不是直接klich+kt,而是klich*2,因为有可能炮灰的血太多了! printf("YES/n/n"); else printf("NO/n/n"); } main() { int i,j,ca; scanf("%d",&ca); while(ca--) { scanf("%d%d%d%d",&n,&r,&k,&d); for(i=0;i<n;i++) { scanf("%d%d%d",&g[i].x,&g[i].y,&g[i].h); pre[i]=-1; num[i]=0; used[i]=0; } bfs(); } }