40分求助!!!
查看原帖
40分求助!!!
770104
louzhengzhe2009楼主2022/10/21 20:57
#include<bits/stdc++.h>
#define N 5005
using namespace std;
struct xx{double x,y,z;}a[N];
int k,n,i,j,tot,q[N],vis[N],head[N],son[N],nxt[N];
double h,r;
inline void add(int x,int y){son[++tot]=y;nxt[tot]=head[x];head[x]=tot;}
inline double dist(int i,int j){
	double xx=(a[i].x-a[j].x)*(a[i].x-a[j].x);
	double yy=(a[i].y-a[j].y)*(a[i].y-a[j].y);
	double zz=(a[i].z-a[j].z)*(a[i].z-a[j].z);
	return sqrt(xx+yy+zz);
}
int main(){
	//freopen("001.in","r",stdin);
	//freopen("001.out","w",stdout);
	scanf("%d",&k);
	while(k--){
		scanf("%d%lf%lf",&n,&h,&r);
		tot=0;
		for(i=0;i<=n+1;i++)head[i]=vis[i]=0;
		for(i=1;i<=n;i++){
			scanf("%lf%lf%lf",&a[i].x,&a[i].y,&a[i].z);
			if(a[i].z<=r)add(0,i),add(i,0);
			if(a[i].z+r>=h)add(i,n+1),add(n+1,i);
		}
		for(i=1;i<=n;i++)
		  for(j=i+1;j<=n;j++)
		  if(dist(i,j)<=2*r)add(i,j),add(j,i);
		int h=1,t=1,flag=0;q[1]=0;vis[0]=1;
		while(h<=t){
			int x=q[h];
			for(i=head[x];i;i=nxt[i]){
				int v=son[i];
				if(vis[v])continue;
				if(v==n+1){flag=1;break;}
				q[++t]=v;vis[v]=1;
			}
			if(flag)break;h++;
		}
		if(flag)printf("Yes\n");
		else printf("No\n");
	}
}

此程序40分,哪里错了呢???

2022/10/21 20:57
加载中...