CQUPT第九届ACM校赛 G-地雷迷阵


1521: 地雷迷阵

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值