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

解决本题的算法:

 ·深度优先搜索(DFS)

   ·广度优先搜索(BFS)

   ·并查集

本篇将介绍深搜做法。

Luogu P3958 [NOIP2017] 奶酪(DFS) Luogu P3958 [NOIP2017] 奶酪(DFS)

Luogu P3958 [NOIP2017] 奶酪(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;
} 

相关文章:

  • 2021-08-07
  • 2021-11-11
  • 2022-12-23
  • 2022-03-01
  • 2021-10-30
  • 2021-11-29
  • 2021-12-07
  • 2021-07-01
猜你喜欢
  • 2022-12-23
  • 2021-10-11
  • 2021-10-20
  • 2021-12-09
  • 2022-12-23
相关资源
相似解决方案