码迷,mamicode.com
首页 > Windows程序 > 详细

USACO window area 漂浮法

时间:2016-02-06 01:39:07      阅读:316      评论:0      收藏:0      [点我收藏+]

标签:

  这道题是求解几个矩形未被遮挡的面积问题, 可以使用漂浮法来解决, 什么事漂浮法请看这里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 漂浮法

标签:

原文地址:http://www.cnblogs.com/xingxing1024/p/5183664.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!