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";
}
}
}