题目地址
我觉得这个题用来理解深搜还是非常好的
只给提示
1.我们知道杰瑞要进洞的话一定需要遍历所有可能从下表面进入的点
2.进入之后我们要找所有可能连通并且的点
3.最后状态是找到了可以出去的点
需要注意的地方 1.数据范围
2.深搜时我们需要对一个洞口进行多次探索吗?
为了方便阅读,我就不压行了,,每次都搞不懂题解压行的人想干啥,,,难道能显得自己更厉害吗?
#include <bits/stdc++.h>
#define ll long long
using namespace std;
double h,n,r,t,vex[1100][4];
bool falg;
int vis[1100];
double get_dis(ll x,ll y,ll z,ll i,ll j,ll k)
{
return sqrt((x-i)*(x-i)+(y-j)*(y-j)+(z-k)*(z-k));
}
void DFS(int pos)
{
if(vex[pos][3]>=(h-r))
{
falg=true;
return;
}
vis[pos]=1;
for(int i=1;i<=n;i++)
{
if((get_dis(vex[pos][1],vex[pos][2],vex[pos][3],vex[i][1],vex[i][2],vex[i][3])<=2*r)&&!vis[i])
{
DFS(i);
}
}
}
int main()
{
for(cin>>t;t;t--)
{
cin>>n>>h>>r;
falg=false;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
for(int j=1;j<=3;j++)
cin>>vex[i][j];
for(int i=1;i<=n;i++)
{
if(!vis[i]&&vex[i][3]<=r)
{
DFS(i);
}
if(falg)
break;
}
if(falg)
{
cout<<"Yes"<<endl;
}
else
cout<<"No"<<endl;
}
return 0;
}
|