Luogu P3958 [NOIP2017] 奶酪(BFS)

解决本题的算法:

    ·深度优先搜索(DFS)

       ·广度优先搜索(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\n");
        else       printf("No\n");
    }
    return 0;
}

 

posted @ 2020-10-06 16:39  wisdom_jie  阅读(199)  评论(0编辑  收藏  举报