USACO window area 漂浮法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

 

以上是关于USACO window area 漂浮法的主要内容,如果未能解决你的问题,请参考以下文章

jquery实现图片漂浮效果

窗体中怎么让toolstrip漂浮(停靠已经做出来了)(C#)

usaco题目分享——Agri-Net

HTML下拉网页,导航条一直漂浮在顶端怎么做?

[UE4]Window Title Bar Area

超简单漂浮广告代码网页漂浮广告代码jQuery漂浮广告div漂浮层