USACO window area 漂浮法

  这道题是求解几个矩形未被遮挡的面积问题, 可以使用漂浮法来解决, 什么事漂浮法请看这里http://www.nocow.cn/index.php/USACO/window, 代码如下:

/*
    ID: m1500293
    LANG: C++
    PROG: window
*/
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;
char s[80];

int buttom, top;
struct Window
{
    char name;
    int x1, y1, x2, y2;
}win[110];
int nwin;

void ocreate(char a[])
{
    char n;
    int x1, y1, x2, y2;
    sscanf(a, "w(%c,%d,%d,%d,%d)", &n, &x1, &y1, &x2, &y2);
    if(x1 > x2) swap(x1, x2);
    if(y1 > y2) swap(y1, y2);
    nwin++;
    for(int i=nwin-1; i>=1; i--)
        win[i] = win[i-1];
    win[0] = (Window){n, x1, y1, x2, y2};
}

void otop(char s[])
{
    char n = s[2];
    int idx = -1;
    for(int i=0; i<nwin; i++) if(win[i].name == n) {idx=i; break;}
    Window tp = win[idx];
    for(int i=idx; i>=1; i--) win[i] = win[i-1];
    win[0] = tp;
}

void obt(char s[])
{
    char n = s[2];
    int idx = -1;
    for(int i=0; i<nwin; i++) if(win[i].name == n) {idx=i; break;}
    Window tp = win[idx];
    for(int i=idx; i<nwin-1; i++)
        win[i] = win[i+1];
    win[nwin-1] = tp;
}
void od(char s[])
{
    char n = s[2];
    int idx = -1;
    for(int i=0; i<nwin; i++) if(win[i].name == n) {idx=i; break;}
    for(int i=idx; i<nwin-1; i++)
        win[i] = win[i+1];
    nwin--;
}

double area;

void dfs(int k, int x1, int y1, int x2, int y2)
{
    if(k==-1) { area += (x2-x1)*(y2-y1);  return; }
    if(k>=0 && (win[k].x1>=x2||win[k].x2<=x1||win[k].y1>=y2||win[k].y2<=y1))
    {
        dfs(k-1, x1, y1, x2, y2);
        return ;
    }
    if(win[k].x1>x1) { dfs(k-1, x1, y1, win[k].x1, y2); x1=win[k].x1; }
    if(win[k].y1>y1) { dfs(k-1, x1, y1, x2, win[k].y1); y1=win[k].y1; }
    if(win[k].x2<x2) { dfs(k-1, win[k].x2, y1, x2, y2); x2=win[k].x2; }
    if(win[k].y2<y2) { dfs(k-1, x1, win[k].y2, x2, y2); y2=win[k].y2; }
}

void os(char s[])
{
    area = 0.0;
    int idx = -1;
    for(int i=0; i<nwin; i++) if(win[i].name == s[2]) { idx=i; break; }
    dfs(idx-1, win[idx].x1, win[idx].y1, win[idx].x2, win[idx].y2);
    int x1=win[idx].x1, x2=win[idx].x2, y1=win[idx].y1, y2=win[idx].y2;
    printf("%.3f\n", area/((x2-x1)*(y2-y1))*100);
}
int main()
{
    freopen("window.in", "r", stdin);
    freopen("window.out", "w", stdout);
    nwin = 0;
    while(scanf("%s", s) != EOF)
    {
        switch(s[0])
        {
        case 'w':
            ocreate(s);
            break;
        case 't':
            otop(s);
            break;
        case 'b':
            obt(s);
            break;
        case 'd':
            od(s);
            break;
        case 's':
            os(s);
            break;
        }
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/xingxing1024/p/5183664.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值