1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| #include<stdio.h> #include<stdlib.h> #include<math.h> struct node{ long long x,y,z; }; struct node a[1005]={0}; int start[1005]={0},end[1005]={0},flag,n; long long h,r; int map[1005][1005]={0}; long long dist(int p1,int p2){ long long x1,y1,z1,x2,y2,z2; x1=a[p1].x; y1=a[p1].y; z1=a[p1].z; x2=a[p2].x; y2=a[p2].y; z2=a[p2].z; return ((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2)); } int judge(int p1,int p2){ if(dist(p1,p2)<=2*r*2*r)return 1; return 0; } int visited[1005]={0}; void dfs(int i){ if(flag)return; int j; for(j=i;j<=n;j++) if(map[i][j]&&!visited[j]){ visited[j]=1; if(end[j]) flag=1; else dfs(j); visited[j]=0; } } void qqsort(int l,int r){ int i,j; long long mid; struct node t; i=l; j=r; mid=a[(i+j)/2].z; do{ while(a[i].z<mid)i++; while(a[j].z>mid)j--; if(i<=j){ t=a[i]; a[i]=a[j]; a[j]=t; i++; j--; } }while(i<=j); if(i<r)qqsort(i,r); if(j>l)qqsort(l,j); } int main(){ int t,i,j,k; scanf("%d",&t); for(i=1;i<=t;i++){ flag=0; scanf("%d%lld%lld",&n,&h,&r); for(j=1;j<=n;j++){ start[j]=0; end[j]=0; } for(j=1;j<=n;j++) scanf("%lld%lld%lld",&a[j].x,&a[j].y,&a[j].z); qqsort(1,n); for(j=1;j<=n;j++){ if(a[j].z-r<=0)start[j]=1; if(a[j].z+r>=h)end[j]=1; for(k=j+1;k<=n;k++) if(judge(j,k)){ map[j][k]=1; map[k][j]=1; } else{ map[j][k]=0; map[k][j]=0; } } for(j=1;j<=n;j++){ if(start[j]&&end[j]){ flag=1; break; } if(start[j])dfs(j); else break; if(flag)break; } if(flag)printf("Yes\n"); else printf("No\n"); } return 0; }
|