最坏复杂度 Θ(n3) 都能过。
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#define int long long
#define MAX_TIME 0.05
using namespace std;
const int N=1e3+10;
int dm,n,h,r,T;
bool vis[N];
bool jieshuli;//搜索结束
double e[N][N];
struct dian{
int x,y,z;
}a[N];
inline double dist(dian a,dian b){
int x1=a.x,x2=b.x;
int y1=a.y,y2=b.y;
int z1=a.z,z2=b.z;
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2));
}
inline bool qie(dian a,dian b){
if(double(2.0*r)>=dist(a,b))return true;
return false;
}
inline void dfs(int i){//搜第 i 个球
vis[i]=1;
if(a[i].z<=r&&i!=dm){
return;
}
if(jieshuli==1){
return;
}
if(a[i].z+r>=h){
cout<<"Yes\n";//最上面能碰到
jieshuli=1;
return;
}
for(register int j=1;j<=n;++j){
if(e[i][j]<=0&&vis[j]==0&&a[j].z>=a[i].z){
dfs(j);
vis[j]=0;//回溯
}
}
return;
}
inline bool cmp(dian a,dian b){
return a.z<b.z;
}
signed main(){
// freopen("party.in","r",stdin);
// freopen("party.out","w",stdout);
// ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>T;
while(T--){
// sort(a+1,a+1+n,cmp);
jieshuli=0;
memset(e,99999999.0,sizeof(e));
memset(vis,0,sizeof(vis));
cin>>n>>h>>r;
for(register int i=1;i<=n;++i){
cin>>a[i].x>>a[i].y>>a[i].z;
}
for(register int i=1;i<=n;++i){
for(register int j=1;j<=n;++j){
if(i==j)e[i][j]=99999999.0;
else e[i][j]=dist(a[i],a[j])-2*r;//<=0即相切或者相交
}
}
// while(clock()/PER_SECOND)
for(register int i=1;i<=n;++i){
if(a[i].z<=r){
dm=i;//地面
dfs(i);
}
}
if(jieshuli==0){
cout<<"No\n";
}
}
return 0;
}
/*
in
3
2 4 1
0 0 1
0 0 3
2 5 1
0 0 1
0 0 4
2 5 2
0 0 2
2 0 4
out
Yes
No
Yes
*/