#include<stdio.h> #include<string.h> long long int t, n, h, r; struct ty { long long int x, y, z; }p[1200]; int xianglian(long long int x, long long int y) { return ((p[x].x - p[y].x) * (p[x].x - p[y].x) + (p[x].y - p[y].y) * (p[x].y - p[y].y) + (p[x].z - p[y].z) * (p[x].z - p[y].z) <= (4 * r * r)); } long long int mp[1200][1200]; long long int vis[1200]; int dfs(int x, int y) { if (x == y) return 1; vis[x] = 1; for (int i = 1; i <= n+1; i++) { if (!vis[i] && mp[x][i]) { //判断x,i之间是否相连,并且不返回走; if(dfs(i, y)) return 1; //这是最终结束函数的地方; } } return 0; } int main() { scanf("%lld", &t); while (t--) { memset(vis, 0, sizeof(vis)); memset(mp, 0, sizeof(mp)); memset(p, 0, sizeof(p)); scanf("%lld%lld%lld", &n, &h, &r); for (long long int i = 1; i <= n; i++) { scanf("%lld%lld%lld", &p[i].x, &p[i].y, &p[i].z); } for (long long int i = 1; i <= n; i++) { for (long long int j = 1; j <= n; j++) { if (i != j && xianglian(i, j)) mp[i][j] = 1; if (h - p[j].z <= r) mp[j][n + 1] = 1; //判断是否有和洞顶部相连; if (p[j].z <= r) mp[0][j] = 1; //首先判断地面和洞之间是否相连; } } if (dfs(0, n + 1)) printf("Yes\n"); else printf("No\n"); } return 0; }