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

usaco Window Area

时间:2015-10-07 13:27:16      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:

矩形切割。话说usaco题目精简了之后,没有遇到网上说的第三章说的类似题目。

这题一直看不懂别人怎么切的。

睡了一觉醒来后就自己明白了。

/*
ID: modengd1
PROG: window
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <vector>
using namespace std;
struct WD
{
    bool exist;
    int x0,y0,x1,y1;
    int high;
};
WD allWD[62];
int H,L;
int getindex(char ch)
{
    if(ch<=‘z‘&&ch>=‘a‘)
        return ch-‘a‘;
    if(ch<=‘Z‘&&ch>=‘A‘)
        return ch-‘A‘+26;
    if(ch<=‘9‘&&ch>=‘0‘)
        return ch-‘0‘+52;
}
int getarea(int deep,int xx,int yy,int x_,int y_,int h)
{
    if(xx>=x_||yy>=y_)//矩形不合法
        return 0;
    if(deep==62)//浮到了最顶层
    {
        return (x_-xx)*(y_-yy);
    }
    if(!allWD[deep].exist||h>=allWD[deep].high||allWD[deep].x1<=xx||allWD[deep].x0>=x_||allWD[deep].y1<=yy||allWD[deep].y0>=y_)//不相交
    {
        return getarea(deep+1,xx,yy,x_,y_,h);
    }
    else//切割为上下左右四个部分
    {
        int ret=0;
        ret+=getarea(deep+1,xx,yy,allWD[deep].x0,y_,h);//上
        ret+=getarea(deep+1,allWD[deep].x1,yy,x_,y_,h);//下
        ret+=getarea(deep+1,max(xx,allWD[deep].x0),yy,min(x_,allWD[deep].x1),allWD[deep].y0,h);//左
        ret+=getarea(deep+1,max(xx,allWD[deep].x0),allWD[deep].y1,min(x_,allWD[deep].x1),y_,h);//右
        return ret;
    }
}
int main()
{
    freopen("window.in","r",stdin);
    freopen("window.out","w",stdout);
    char op;
    char id;
    WD newOne;
    H=L=0;
    for(int i=0;i<62;i++)
        allWD[i].exist=false;
    while(~scanf("%c",&op))
    {
        getchar();
        scanf("%c",&id);
        if(op==‘w‘)
        {
            int xx,yy,x_,y_;
            scanf(",%d,%d,%d,%d",&xx,&yy,&x_,&y_);
            newOne.x0=min(xx,x_);newOne.y0=min(yy,y_);//输入时将所有矩形的对角修改为左上角和右下角
            newOne.x1=max(xx,x_);newOne.y1=max(yy,y_);
            newOne.high=++H;
            newOne.exist=true;
            allWD[getindex(id)]=newOne;
        }
        else if(op==‘t‘)
        {
            allWD[getindex(id)].high=++H;

        }
        else if(op==‘b‘)
        {
            allWD[getindex(id)].high=--L;
        }
        else if(op==‘d‘)
        {
            allWD[getindex(id)].exist=false;
        }
        else
        {
            int index=getindex(id);
            int ans=getarea(0,allWD[index].x0,allWD[index].y0,allWD[index].x1,allWD[index].y1,allWD[index].high);
            int div=(allWD[index].x1-allWD[index].x0)*(allWD[index].y1-allWD[index].y0);
            printf("%.3f\n",(double)ans*100/div);

        }
        getchar();getchar();
    }
    return 0;
}

  

usaco Window Area

标签:

原文地址:http://www.cnblogs.com/modengdubai/p/4858531.html

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