你刚刚接手一项窗体界面工程。窗体界面还算简单,而且幸运的是,你不必显示实际的窗体。有 5 种基本操作:
创建一个新窗体
将窗体置顶
将窗体置底
删除一个窗体
输出窗体可见部分的百分比(就是,不被其它窗体覆盖的部分)。
在输入文件中,操作以如下的格式出现。
创建一个新窗体:w(I,x,y,X,Y)
将窗体置顶: t(I)
将窗体置底: b(I)
删除一个窗体:d(I)
输出窗体可见部分的百分比:s(I)
I 是每个窗体唯一的标识符,标识符可以是 'a'..'z', 'A'..'Z' 和 '0'..'9' 中的任何一个。输入文件中没有多余的空格。
(x,y)和(X,Y)是窗体的对角。当你创建一个窗体的时候,它自动被“置顶”。你不能用已经存在的标识符来创建窗体,但是你可以删除一个窗体后再用已删除窗体的标识符来创建窗体。坐标用正整数来表示,并且所有的窗体面积都不为 0(x <> X 且 y <> Y)。x 坐标和 y 坐标在 1 —— 32767 的范围内。
格式
PROGRAM NAME: window
INPUT FORMAT
输入文件包含给你的解释程序的一系列命令,每行一个。当输入文件结束时,停止程序。
OUTPUT FORMAT
只对于 s() 命令进行输出。当然,输入文件可能有许多 s() 命令(不超过500次),所以输出文件应该是一个百分比的序列,每行一个,百分比是窗体可见部分的百分比。百分比应该四舍五入到三位小数。
SAMPLE INPUT (file window.in)
w(a,10,132,20,12)
w(b,8,76,124,15)
s(a)
SAMPLE OUTPUT (file window.out)
49.167
【参考程序】:
/*
ID: XIONGNA1
PROG: window
LANG: C++
*/
#include<cstdio>
#include<cstring>
using namespace std;
int L[256],R[256],U[256],D[256];
int prev[256],next[256];
char S[256];
int head,tail;
int get_n()
{
return S[2];
}
void Swap(int & x,int & y)
{
int t=x;x=y;y=t;
}
void addtail(int x)
{
prev[x]=tail; next[x]=-1;
if (tail!=-1) next[tail]=x;
tail=x;
if (head==-1) head=x;
}
void remove(int x)
{
if (x!=tail) prev[next[x]]=prev[x];
if (x!=head) next[prev[x]]=next[x];
if (x==tail) tail=prev[x];
if (x==head) head=next[x];
}
void addhead(int x)
{
prev[x]=-1; next[x]=head;
if (head!=-1) prev[head]=x;
head=x;
if (tail==-1) tail=x;
}
int cut(int l,int r,int u,int d,int k)
{
while (k!=-1 && (R[k]<=l || L[k]>=r || U[k]>=d || D[k]<=u))
k=next[k];
if (k==-1) return (r-l)*(d-u);
int area=0;
if (L[k]>l)
{
area+=cut(l,L[k],u,d,next[k]);
l=L[k];
}
if (R[k]<r)
{
area+=cut(R[k],r,u,d,next[k]);
r=R[k];
}
if (U[k]>u) area+=cut(l,r,u,U[k],next[k]);
if (D[k]<d) area+=cut(l,r,D[k],d,next[k]);
return area;
}
void solve_w()
{
int n=get_n();
sscanf(S+4,"%d,%d,%d,%d",L+n,U+n,R+n,D+n);
if (L[n]>R[n]) Swap(L[n],R[n]);
if (U[n]>D[n]) Swap(U[n],D[n]);
addtail(n);
}
void solve_t()
{
int n=get_n();
remove(n);
addtail(n);
}
void solve_b()
{
int n=get_n();
remove(n);
addhead(n);
}
void solve_d()
{
int n=get_n();
remove(n);
}
void solve_s()
{
int n=get_n();
int ans=cut(L[n],R[n],U[n],D[n],next[n]);
printf("%.3lf\n",100.0*(double)ans/((R[n]-L[n])*(D[n]-U[n])));
}
void solve()
{
switch (S[0])
{
case 'w':
solve_w();
break;
case 't':
solve_t();
break;
case 'b':
solve_b();
break;
case 'd':
solve_d();
break;
case 's':
solve_s();
break;
}
}
int main()
{
freopen("window.in","r",stdin);
freopen("window.out","w",stdout);
memset(prev,-1,sizeof(prev));
memset(next,-1,sizeof(next));
head=-1; tail=-1;
while (scanf("%s",S)!=EOF) solve();
return 0;
}