解决本题的算法:
·广度优先搜索(BFS)
·并查集
本篇将介绍广搜做法。
题解
做法与dfs相似,首先找出所有与下表面通的洞存入a数组(模拟队列),依次寻找能和下表面相通的洞存入队列,对于每一个存入的洞i,判断如果z[i]+r>=h,则可以到达上表面,停止搜索。
相比于dfs,广搜的做法跑量可能更大一些。
#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; long long x[1005],y[1005],z[1005]; bool v[1005],tong; int a[1005]; int main() { int T,i,j,k,n,h,r; double dis; scanf("%d",&T); while(T--) { j=0;tong=0; memset(a,0,sizeof(a)); memset(v,0,sizeof(v)); scanf("%d%d%d",&n,&h,&r); for(i=1;i<=n;i++) { scanf("%d%d%d",&x[i],&y[i],&z[i]); if(z[i]-r<=0){j++;a[j]=i;v[i]=1;} } for(i=1;i<=j;i++) { if(z[a[i]]+r>=h){tong=1;break;} for(k=1;k<=n;k++) { if(v[k]==1)continue; dis=sqrt((x[a[i]]-x[k])*(x[a[i]]-x[k])+(y[a[i]]-y[k])*(y[a[i]]-y[k])+(z[a[i]]-z[k])*(z[a[i]]-z[k])); if(dis<=2*r){j++;a[j]=k;v[k]=1;} } } if(tong==1)printf("Yes "); else printf("No "); } return 0; }