请求加强数据
查看原帖
请求加强数据
638718
xueruo楼主2023/5/20 13:24


最坏复杂度 Θ(n3)\Theta(n^3) 都能过。

#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
*/
2023/5/20 13:24
加载中...