1. 程式人生 > 實用技巧 >洛谷 P3958 乳酪 題解

洛谷 P3958 乳酪 題解

時隔多日,我經歷完中考又回來了!

剛剛步入高中生活,又要抽出一部分時間來打信競,實在是壓力山大。

但是,我相信經過競賽對我的磨礪一定對我的未來大有用處。

所以話不多說,來看今天這道做過很多遍的經典考題。


這道題最主要的目的是判斷上下表面的連通性,所以,對於每一個球(可以看作是點)我們只需要關注能否從下表面達到。

想到這裡,自然而然地可以想到用深搜來實現這道題。

細節上的問題可以看程式碼,思路比較容易

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include
<cmath> #define int long long #define maxn 1010 #define rep(i,s,e) for(register int i=s;i<=e;++i) #define dwn(i,s,e) for(register int i=s;i>=e;--i) using namespace std; inline int read() { int x=0,f=1; char c=getchar(); while(c<'0'||c>'9') {if(c=='-') f=-1; c=getchar();}
while(c>='0'&&c<='9') {x=x*10+c-'0'; c=getchar();} return f*x; } inline void write(int x) { if(x<0){putchar('-');x=-x;} if(x>9)write(x/10); putchar(x%10+'0'); } int T,flag=0; int n; double h,r; int book[maxn]; struct node { double x,y,z; }a[maxn]; bool cmp(node p,node q) {
return p.z<q.z; } double dist(double xx,double yy,double zz,double xxx,double yyy,double zzz) { return sqrt((xx-xxx)*(xx-xxx)+(yy-yyy)*(yy-yyy)+(zz-zzz)*(zz-zzz)); } void dfs(node x,int num) { if(x.z+r>=h) { flag=1; return; } book[num]=1; rep(i,1,n) { if(flag==1) return; if(book[i]==0&&dist(x.x,x.y,x.z,a[i].x,a[i].y,a[i].z)<=2*r) { dfs(a[i],i); } } } signed main() { T=read(); while(T--) { flag=0; memset(book,0,sizeof(book)); n=read(); cin>>h>>r; rep(i,1,n) { cin>>a[i].x>>a[i].y>>a[i].z; } sort(a+1,a+n+1,cmp); rep(i,1,n) { if(a[i].z-r<=0) { dfs(a[i],i); } } if(flag==1) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }