NOIP 2017 D2T1 奶酪

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;


typedef struct node {
    double x,y,z;
} qiu;

qiu a[1005];

bool cmp(qiu aa,qiu bb) {
    return aa.z < bb.z ;
}

double dis(qiu p1,qiu p2) {
    return sqrt(pow((p1.x -p2.x ),2)+pow((p1.y -p2.y ),2)+pow((p1.z -p2.z ),2));
}

bool flag;
long long n;
double h,r;
bool b[1005];
long long link[1005][1005];
bool fail[1005];
//void dfs(long long id) {
//  if(flag) return;
//  long long i;
//  for(i=1; i<=n; i++) {
//      if(i==id) continue;
//      if(!b[i]&&link[id][i]<=2*r) {
//          b[i]=1;
//          if(a[i].z + r >=h){
//              return;
//          }else{
//              dfs(i);
//          }
//
//          b[i]=0;
//      }
//  }
//}

void dfs(long long id,long long sum) {
    if(flag) return;
    if(sum + r >= h) {
        flag=1;
        return;
    }
    register int i;
    for(i=1; i<=n; i++) {
        if(i==id) continue;
        if(!b[i]&&link[id][i]<=2*r&&!fail[i]) {
            b[i]=1;
            dfs(i,a[i].z);
            b[i]=0;
            fail[i]=1;
        }
    }
}

int main() {
    long long t;
//  freopen("test.in","r",stdin);
//  freopen("cheese.out","w",stdout);
    scanf("%lld",&t);
    while(t--) {
        memset(b,0,sizeof(b));
        memset(fail,0,sizeof(fail));
        bool succ=0;

        scanf("%lld%lf%lf",&n,&h,&r);
        for(long long i=1; i<=n; i++) {
            scanf("%lf%lf%lf",&a[i].x ,&a[i].y ,&a[i].z );
        }
        sort(a+1,a+1+n,cmp);
        for(register int i=1; i<=n; i++) {
            for(long long j=1; j<=n; j++) {
                link[i][j]=dis(a[i],a[j]);
                link[j][i]=dis(a[i],a[j]);
            }
        }
//      for(long long i=1;i<=n;i++){
//          cout<<a[i].x <<" "<<a[i].y <<" "<<a[i].z <<endl;
//      }
        for(register int i=1; i<=n; i++) {
            if(abs(a[i].z )-r>0) break;
            else {
//              cout<<i<<endl;
                flag=0;
                dfs(i,a[i].z);
                if(flag) {
                    cout<<"Yes"<<endl;
                    succ=1;
                    break;
                }
            }

        }
        if(!succ) cout<<"No"<<endl;
//      if(abs(a[1].z) - r >0) {
//          cout<<"No"<<endl;
//          continue;
//      } else {
//          flag=0;
//          dfs(1);
//          if(flag==1){
//              cout<<"Yes"<<endl;
//              continue;
//          }
//      }

    }
    return 0;
}

本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9247549.html

原文地址:https://www.cnblogs.com/ghostcai/p/9247549.html