#P2494. Acid Text
Acid Text
描述
背景
几个月前,网页标准项目(WaSP)推出了一项针对现代浏览器及其HTML级联样式表(CSS)实现的测试,名为acid2。这项测试确保所有浏览器在解析和显示HTML的CSS文件时能得出相似的结果。由于你希望在标准合规性方面超越其他基于文本的浏览器,所以你直接开始为自己最喜欢的文本浏览器Lynks实现CSS功能。
问题
你的文本浏览器会收到一组图形文件和一个简化的CSS样式表。一个图形由名称、高度、宽度以及一个二维字符数组定义。除了表示透明像素的字符“.”之外,所有字符都要打印出来。以下是一个示例图片:
owl.png 5 7
.-----.
|O...O|
|..v..|
|.<_>.|
.-----.
给定样式表后,你的任务是生成浏览器应该显示的图形结果。一个CSS文件由多个条目组成,每个条目的格式如下:
#<id> {
pos-x : <x> px ;
pos-y : <y> px ;
position : <relative = <id of graphic>|absolute> ;
file : <filename> ;
layer : <layer-number> ;
}
CSS条目的规则如下:
- 行数:每个CSS条目都如上述输入那样,恰好占7行。
- 顺序:每个CSS条目都恰好包含pos-x、pos-y、position、file和layer这5个属性,且顺序固定,每个属性独占一行。
- 空白字符:在每行的开头、结尾,或者上述示例中有空格的地方,可能存在零个或多个空白字符(空格和制表符)。
合成图片的规则如下:
- 背景:背景假定为黑色(即空白字符)。
- 定位:视口的左上角假定为。绝对定位始终基于这个左上角。相对定位信息始终基于另一个图形的左上角像素。CSS元素之间不会有任何循环引用。最终的所有位置在和方向上都为零或正值。
- 分层:图层编号较高的图形要在图层编号较低的图形之后打印。图层编号相同的图形按照在CSS中出现的顺序打印。
输入
输入的第一行是后续测试用例的数量。对于每个测试用例,会给出以下信息:第一行包含要跟随的文件数量(至少1个,最多个),每个文件由文件名、高度、宽度组成的空格分隔三元组表示(),然后是行,每行恰好包含个字符。文件定义之后是单独的一行,包含数字(至少1个,最多个),接着是包含个条目的CSS文件。
你可以假定最终生成的图片最大为个字符。CSS条目中的所有坐标都以绝对值小于的整数给出。所有文件名和标识符仅由字母数字字符和点组成。没有两个文件具有相同的名称,也没有两个标识符是相等的。图层属性的值至少为0,最多为。
输出
每个测试用例的输出以一行 “Scenario #i:” 开头,其中是从1开始的测试用例编号。对于每个测试用例,按照CSS文件中的指令叠加所有给定图形,并打印最终的图形结果。每个测试用例的结果应尽可能是最小的矩形。然而,透明像素始终属于最终的图片,即使它们直接位于边界上。结果的左上角应始终包含位置。所有空白区域都应该用空格填充。每个测试用例的输出以一个空行结束。
输入数据1
1
4
bg.png 5 7
.-----.
|.....|
|.....|
|.....|
.-----.
eye.jpg 1 1
O
nose.bmp 1 1
v
mouth.png 1 3
<_>
5
#bg {
pos-x: 1 px;
pos-y: 1 px;
position: absolute;
file: bg.png;
layer: 0;
}
#leftEye {
pos-x: 1 px;
pos-y: 1 px;
position: relative=bg;
file: eye.jpg;
layer: 1;
}
#rightEye {
pos-x: 4 px;
pos-y: 0 px;
position: relative=leftEye;
file: eye.jpg;
layer: 1;
}
#nose {
pos-x: 2 px;
pos-y: 1 px;
position: relative=leftEye;
file: nose.bmp;
layer: 1;
}
#mouth {
pos-x: -1 px;
pos-y: 1 px;
position: relative = nose;
file: mouth.png;
layer: 1;
}
输出数据1
Scenario #1:
-----
|O O|
| v |
| <_> |
-----
来源
2005年德国达姆施塔特工业大学编程竞赛