Luogu P3958 [NOIP2017] 奶酪(DFS)

又回到了这道充满回忆的题目,复出重学算法。

解决本题的算法:

 ·深度优先搜索(DFS)

   ·广度优先搜索(BFS)

   ·并查集

本篇将介绍深搜做法。

 

   题解

  首先,找出所有可以从下表面进入的球,然后进行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;
} 
posted @ 2020-10-06 16:21  wisdom_jie  阅读(149)  评论(0编辑  收藏  举报