1.分析
由于是学习深搜,直接就用深搜做了,感觉挺简单,有点判断图的连通性的问道。
2.代码
1.前两次提交
第一次提交,就过了两个点,莫名奇妙的,然后见了剪了一下枝,突然就能过8个点了。
2.AC代码
后来做不出来,看了下题解,发现是因为没有注意到原题中数据的范围导致错误,把数据类型都换成长整型之后,顺利AC
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <cstring>
#include <stdio.h>
using namespace std;
typedef long long ll;
ll T,N,H,R;
struct circle
{
ll x,y,z;
ll r;
bool isConnected(circle b)
{
return (x-b.x)*(x-b.x)+(y-b.y)*(y-b.y)+(z-b.z)*(z-b.z)<=(r+b.r)*(r+b.r);
}
bool isBottom()
{
return z-r<=0;
}
bool isTop()
{
return z+r>=H;
}
};
int flag;
circle a[1001];
int isVisited[1001];
void dfs(circle c)
{
if(c.isTop())
{
cout<<"Yes\n";
flag=1;
return;
}
for (int i = 1; i <= N; i++)
{
if(!isVisited[i]&&c.isConnected(a[i])&&!flag )
{
isVisited[i]=1;
dfs(a[i]);
}
}
}
void solve()
{
int i;
for ( i = 1; i <= N; i++)
{
if(!isVisited[i]&&a[i].isBottom()&&!flag)
{
isVisited[i]=1;
dfs(a[i]);
}
}
}
int main()
{
cin>>T;
while (T--)
{
cin>>N>>H>>R;
for (int i = 1; i <= N; i++)
{
cin>>a[i].x>>a[i].y>>a[i].z;
a[i].r=R;
}
flag=0;
memset(isVisited,0,sizeof(isVisited));
solve();
if(!flag)
{
cout<<"No\n";
}
}
}