题目描述:传送门
思路:
首先,我考虑用深搜来做这道题,vis数组用map(映射表)。但由于我用的是结构体,所以重载了运算符。但可惜超时。
于是,我选用BFS来做这道题,但要注意:
1.n = 1时,有特殊情况,需要特判。
2.根号下的那堆东西,会爆int,要用double。
废话不多说,附上代码(代码有点多 )
#include <bits/stdc++.h>
using namespace std;
template < typename T > void read(T &x)
{
int f = 1;x = 0;char c = getchar();
for (;!isdigit(c);c = getchar()) if (c == '-') f = -f;
for (; isdigit(c);c = getchar()) x = x * 10 + c - '0';
x *= f;
}
int n, flag = 1;
double h, r;
struct node
{
double x, y, z;
bool operator<(const node &rhs) const {
if (x == rhs.x) {
if(y == rhs.y){
return z < rhs.z;
}
else{
return y < rhs.y;
}
} else {
return x < rhs.x;
}
}
};
node q[100005];
node a[100005];
map < node , bool > vis;
void bfs(int x, int y, int z)
{
int front, rear;
front = rear = 1;
node temp;
temp.x = x;
temp.y = y;
temp.z = z;
vis[temp] = 1;
q[front] = temp;
while(front <= rear)
{
for(int i = 1;i <= n;i++)
{
temp.x = a[i].x;
temp.y = a[i].y;
temp.z = a[i].z;
if(vis[temp] == 0 && sqrt((q[front].x - temp.x) * (q[front].x - temp.x) + (q[front].y - temp.y) * (q[front].y - temp.y) + (q[front].z - temp.z) * (q[front].z - temp.z)) <= 2 * r)
{
rear++;
q[rear].x = temp.x;
q[rear].y = temp.y;
q[rear].z = temp.z;
vis[temp] = 1;
if(q[rear].z + r >= h)
{
cout << "Yes" << endl;
flag = 0;
return;
}
}
}
front++;
}
}
int main()
{
//freopen("cheese.in", "r", stdin);
//freopen("cheese.out", "w", stdout);
int T;
cin >> T;
while(T)
{
T--;
flag = 1;
int flag2 = 1, flag3 = 1;
vis.clear();
cin >> n >> h >> r;
node tempx;
tempx.x = 0;
tempx.y = 0;
tempx.z = 0;
for(int i = 1;i <= n;i++)
a[i] = tempx;
for(int i = 1;i <= 10000;i++)
q[i] = tempx;
if(n == 1)
{
int x, y, z;
read(x);
read(y);
read(z);
if(z + r >= h && z - r <= 0) cout << "Yes" << endl;
else cout << "No" << endl;
continue;
}
for(int i = 1;i <= n;i++)
{
cin >> a[i].x >> a[i].y >> a[i].z;
if(a[i].z - r <= 0.0) flag3 = 0;
if(a[i].z + r >= h) flag2 = 0;
}
if(flag2 ||flag3)
{
cout << "No" << endl;
continue;
}
for(int i = 1;i <= n;i++)
if(a[i].z - r <= 0.0)
{
bfs(a[i].x, a[i].y, a[i].z);
if(flag == 0) break;
}
if(flag) cout << "No" << endl;
}
return 0;
}