1521: 地雷迷阵
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 44 Solved: 6
[ Submit][ Status][ Web Board]
Description
CC公主被抓走了,为了救回她,你要通过九个关卡的考验。
在这一关中,炸弹人·magic·鲁在一座桥上步下了地雷阵。桥可以抽象为一个矩形。在坐标系下,桥的宽度方向为x方向,桥的长度方向为y方向,初始你站在y=0的这一侧。桥上有一些地雷,你不能踏入地雷的爆炸范围(包括边界上的点),也不能超出桥的宽度。
你能闯过雷阵,到达桥对面吗?
Input
输入的第一行包含一个正整数T(1<=T<=100)。T表示数据组数。
每一组数据的第一行包括三个整数W(1<=W<=100)、L(1<=L<=100)和N(1<=N<=100)。W表示桥的宽度,L表示桥的长度,N表示地雷的数量。
接下来的N行,每行包括三个精确到小数点后两位的实数Xi(0<=Xi<=W)、Yi(0<=Yi<=L)和Ri(Ri>0)。(Xi,Yi)表示地雷的坐标,Ri表示地雷的爆炸半径。
数据保证地雷的爆炸范围不会包括Y为0和Y为L的点。
Output
对于每组数据,如果能在不进入地雷爆炸范围(包括圆上的点)且不掉下桥的情况下到达桥的另一端,在单独的一行中输出“Nice”。否则,在单独的一行中输出“GG”。
Sample Input
2
18 100 2
5.00 38.00 5.00
13.00 32.00 5.00
3 10 2
0.50 6.00 1.00
2.50 5.00 1.00
Sample Output
GG
Nice
HINT
题解:只需要判断是否存在一条相连的地雷是否把宽都覆盖。先判断每一个地雷是否与其他地雷相连。再用dfs判断是否存在一条地雷线路把所有宽都覆盖。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 105;
double x[maxn],y[maxn],r[maxn];
bool Link[maxn][maxn];
bool vis[maxn];
double w,l;
int n;
int T;
bool f(int a,int b)
{
if((x[a] - x[b]) * (x[a] - x[b]) + (y[a] - y[b]) * (y[a] - y[b]) <= (r[a] + r[b]) * (r[a] + r[b]))
{
return 1;
}
else
{
return 0;
}
}
void dfs(int x)
{
vis[x] = 1;
for(int i = 0;i <= n + 1;i++)
{
if(Link[i][x] && !vis[i])
{
dfs(i);
}
}
}
int main()
{
scanf("%d",&T);
while(T--)
{
memset(vis,0,sizeof(vis));
memset(Link,0,sizeof(Link));
scanf("%lf%lf%d",&w,&l,&n);
for(int i = 1;i <= n;i++)
{
scanf("%lf%lf%lf",&x[i],&y[i],&r[i]);
}
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= n;j++)
{
if(f(i,j))
{
Link[i][j] = Link[j][i] = 1;
}
}
}
for(int i = 1;i <= n;i++)
{
if(x[i] <= r[i])
{
Link[0][i] = Link[i][0] = 1;
}
if(x[i] + r[i] >= w)
{
Link[n + 1][i] = Link[i][n + 1] = 1;
}
}
dfs(0);
if(vis[n + 1])
{
printf("GG\n");
}
else
{
printf("Nice\n");
}
}
return 0;
}