Heliport

Heliport

#include<cstdio>
#include<math.h>
const double eps = 1e-6;

int x[25], y[25], n, i, len, px, py, cases;

double ra, rb, r;
char dr;
bool check(double ox, double oy)
{
    int i, s;
    s = 0;
    for (i = 0; i < n; i++)
        if (x[i]>ox&&((y[i]>oy)^(y[i+1]>oy))) s++;
        if (s % 2 == 0)return false;
        for (i = 0; i < n; i++)
        {
            if ((x[i] - ox)*(x[i] - ox) + (y[i] - oy)*(y[i] - oy) < (r - eps)*(r - eps))
                return false;
            if (x[i] == x[i + 1] && ((y[i] > oy) ^ (y[i + 1] > oy)) && fabs(x[i] - ox) < r - eps)return false;
            if (y[i] == y[i + 1] && ((x[i] > ox) ^ (x[i + 1] > ox)) && fabs(y[i] - oy) < r - eps)return false;
        }
        return true;
}
bool ok()
{
    int i, j;
    double di, dd, mx, my, dx, dy;
    for (i = 0; i < n; i++)
        if (x[i] == x[i + 1])
            for (j = 0; j < n;j++)
                if (y[j] == y[j + 1]){
                    if (check(x[i] + r, y[j] + r))return true;
                if (check(x[i] + r, y[j] - r))return true;
                if (check(x[i] - r, y[j] + r))return true;
                if (check(x[i] - r, y[j] - r))return true;
            }
        for (i = 0; i < n; i++)
            for (j = 0; j < n;j++)
                if (x[i] == x[i + 1])
                {
                    di = fabs(x[j] - (x[i] + r));
                    if (di < r)
                    {
                        dd = sqrt(r*r-di*di);
                        if (check(x[i] + r, y[j] + dd))return true;
                        if (check(x[i] + r, y[j] - dd))return true;
                    }
                    di = fabs(x[j]-(x[i]-r));
                    if (di < r)
                    {
                        dd = sqrt(r*r - di*di);
                        if (check(x[i] + r, y[j] + dd))return true;
                        if (check(x[i] + r, y[j] - dd))return true;
                    }
                }
                else
                {
                    di = fabs(y[j]-(y[i]+r));
                    if (di < r)
                    {
                        dd = sqrt(r*r - di*di);
                        if (check(x[i] + dd, y[j] + r))return true;
                        if (check(x[i] - dd, y[j] + r))return true;
                    }
                    di = fabs(y[j] - (y[i] - r));
                    if (di < r)
                    {
                        dd = sqrt(r*r - di*di);
                        if (check(x[i] + dd, y[j] + r))return true;
                        if (check(x[i] + dd, y[j] - r))return true;
                    }
                }
        for (i = 0; i < n - 1; i++)
            for (j = i + 1; j < n; j++)
            {
                mx = (x[i]+x[j])/2.0;
                my = (y[i]+y[j])/2.0;
                di = sqrt((x[i]-mx)*(x[i]-mx)+(y[i]-my)*(y[i]-my));
                if (di>0 && di < r)
                {
                    dd = sqrt(r*r-di*di);
                    dx = (my - y[i]) / di*dd;
                    dy = (x[i]-mx)/di*dd;
                    if (check(mx + dx, my + dy))return true;
                    if (check(mx - dx, my - dy))return true;
                }
            }
        return false;
}
int main()
{
    while (scanf_s("%d",&n)&&n)
    {
        if (cases)printf("\n");
        px = 0; py = 0;
        for (i = 1; i <= n; i++)
        {
            scanf_s("%d %c", &len, &dr);
            if (dr == 'R')px += len;
            if (dr == 'L')px -= len;
            if (dr == 'U')py += len;
            if (dr == 'D')py -= len;
            x[i] = px;
            y[i] = py;
        }
        ra = 0; rb = 999;
        while (rb - ra > eps)
        {
            r = (ra + rb) / 2;
            if (ok())ra = r;

            else rb = r;
        }
        printf("Case Number %d radius is: %.21f\n", ++cases, r);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值