WA on #6#7#8#9
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
int T;
bool flag=false;
int n,h,r;
struct node
{
double x,y,z;
};node no[1005];
vector<int> g[1005];
bool vis[1005];
void dfs(int x)
{
if(no[x].z+r>=h)
{
flag=true;
return;
}
if(flag==true) return;
if(vis[x]==true) return;
vis[x]=true;
for(int i=0;i<g[x].size();i++)
{
if(!vis[i]) dfs(g[x][i]);
}
}
double dist(node a, node b)
{
return sqrt((a.x - b.x) * (a.x - b.x) +
(a.y - b.y) * (a.y - b.y) +
(a.z - b.z) * (a.z - b.z));
}
int main(){
cin>>T;
while(T--)
{
cin>>n>>h>>r;
for(int i=1;i<=n;i++)
{
cin>>no[i].x>>no[i].y>>no[i].z;
}
for(int i=1;i<=n;i++) g[i].clear();
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
double k=dist(no[i],no[j]);
if(k<=2*r)
{
g[i].push_back(j);
g[j].push_back(i);
}
}
flag=false;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
if(no[i].z<=r)
dfs(i);
if(flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
但是换成邻接矩阵就能AC:
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
int T;
bool flag=false;
int n,h,r;
struct node
{
double x,y,z;
};node no[1005];
bool g[1005][1005];
bool vis[1005];
void dfs(int x)
{
if(vis[x]==true) return;
if(no[x].z+r>=h)
{
flag=true;
return;
}
vis[x]=true;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&g[x][i]) dfs(i);
}
}
double dist(node a, node b)
{
return sqrt((a.x - b.x) * (a.x - b.x) +
(a.y - b.y) * (a.y - b.y) +
(a.z - b.z) * (a.z - b.z));
}
int main(){
cin>>T;
while(T--)
{
flag=false;
memset(vis,0,sizeof(vis));
memset(g,0,sizeof(g));
cin>>n>>h>>r;
for(int i=1;i<=n;i++)
{
cin>>no[i].x>>no[i].y>>no[i].z;
}
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
double k=dist(no[i], no[j]);
if(k<=r+r)
{
g[i][j]=true;
g[j][i]=true;
}
}
for(int i=1;i<=n;i++)
if(no[i].z<=r)
dfs(i);
if(flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
调了两小时了,有哪位大佬能帮忙调一下第一种做法,悬2~3关,感谢!