Luogu P3958 [NOIP2017] 奶酪(DFS)
又回到了这道充满回忆的题目,复出重学算法。
解决本题的算法:
·深度优先搜索(DFS)
·并查集
本篇将介绍深搜做法。
题解
首先,找出所有可以从下表面进入的球,然后进行dfs,如果遇到点的高度z[i]+r>=h,说明跑到上表面,返回。每个点最多访问一次。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; bool v[1005],tong; long long x[1005],y[1005],z[1005]; int a[1005],n,h,r; void dfs(int d) { v[d]=1; if(z[d]+r>=h){tong=1;return;} double dis; int next; for(int i=1;i<=n;i++) { if(v[i]==1)continue; dis=sqrt((x[d]-x[i])*(x[d]-x[i])+(y[d]-y[i])*(y[d]-y[i])+(z[d]-z[i])*(z[d]-z[i])); if(dis<=2*r) dfs(i); } } int main() { int T,j; scanf("%d",&T); while(T--) { memset(a,0,sizeof(a)); memset(v,0,sizeof(v)); tong=0; scanf("%d%d%d",&n,&h,&r); j=0; for(int 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(int i=1;i<=j;i++) { dfs(a[i]); if(tong==1)break; } if(tong==1)printf("Yes\n"); else printf("No\n"); } return 0; }