蒟蒻的第一篇题解

Xrain06

2020-12-25 19:53:53

Personal

其实这题暴力(dfs)都可以过。。。\ ~~蒟蒻表示不知道怎么用并查集~~ ------------ 既然是道金题,肯定很简单。 题目要求就是一个三维空间内,有几个圆形空洞,要从这些洞走到顶层。 为什么是圆形? 题目给了两个点的距离公式,而球体的特点就是圆形到球面上的每个点距离相等,这样就很方便判断了。 ```cpp #include<bits/stdc++.h> using namespace std; int t,n; long long h,r; bool f,f1[1001]; struct node{ long long x; long long y; long long z; }a[1001]; bool cmp(node a,node b){ return a.z<b.z; } void dfs(int i){ if(f)return; if(f1[i])return;//剪枝 if(a[i].z+r>=h){//判断到没到终点 f=1; return; } f1[i]=1; for(int j=1;j<=n;j++){ if(i==j)continue; if(sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y)+(a[i].z-a[j].z)*(a[i].z-a[j].z))>r*2)continue;//判断能不能到 dfs(j); } } int main(){ cin>>t; while(t--){ cin>>n>>h>>r; for(int i=1;i<=n;i++){ cin>>a[i].x>>a[i].y>>a[i].z; } sort(a+1,a+n+1,cmp);//其实不需要 f=0; for(int i=1;i<=n;i++){ if(a[i].z>r){ break; } memset(f1,0,sizeof(f1)); dfs(i); if(f){ break; } } if(f)cout<<"Yes"; else cout<<"No"; cout<<'\n'; } return 0; } ```