思路:并查集详细讲解——https://blog.csdn.net/u013546077/article/details/64509038
本题主要是找到两个相切且能穿透奶酪的点,即为所求答案。
用到方法为图论:当两个点可以相连,代码为:dong[pre(i)]=pre(j);//i点与j点满足条件,则委屈一下j。最后将上表面,可相连的洞,以及下表面相连。最后若相连成功则输出YES,否则输出NO
#include<iostream> #include<cstdio> #include<cmath> int x[10],y[10],z[10]; int pre();//上级 int dong[10];//根节点 using namespace std; int n,h,r; double ph(double x){ return x*x; } bool check(int a,int b){ if(sqrt(ph(x[a]-x[b])+ph(y[a]-y[b])+ph(z[a]-z[b]))<=2*r) return true; else return false; } int pre(int x){ if(dong[x]==x) return x; else return dong[x]=pre(dong[x]);//找到节点dong[x]的上级并返回根节点 } int main(){ int T; cin>>T; while(T--){ cin>>n>>h>>r; for(int i=1;i<=n;i++) cin>>x[i]>>y[i]>>z[i]; for(int i=1;i<=n+2;i++) dong[i]=i;//初始化 for(int i=1;i<=n;i++) for(int j=i+1;i<=n;i++){ if(!check(i,j)) continue; else dong[pre(i)]=pre(j); } for(int i=1;i<=n;i++){ if(z[i]+r>=h) dong[pre(n+1)]=pre(i); if(z[i]-r<=0) dong[pre(n+2)]=pre(i); } printf("%s\n",pre(n+1)==pre(n+2)?"Yes":"No"); } return 0; }