UVA1087 Struts and Springs
题目描述
本题的任务是模拟屏幕上窗口的缩放和移动。每个窗口占据屏幕上的一个矩形区域,并且可以包含其他窗口,形成一个层次结构。当顶层窗口缩放时,它们的直接包含窗口可能会改变位置和大小(根据支杆和弹簧的参数,见后),而这些改动可能会进一步影响到这些窗口所直接包含的窗口。
概念上讲,支杆是一根长度固定的小棍,可以放在同一个窗口的两个水平边界之间或者两个垂直边界之间,也可以放在一个窗口的某边界与它父窗口的对应边之间。当一个支杆连接两条边时,这两条边之间的距离将保持不变;但如果把支杆换成弹簧,这两条边之间距离可以改变。
每个非顶层窗口都有 $6$ 根支杆或者弹簧,分别位于两条水平边界之间、两条垂直边界之间、已经上/下/左/右边界和父窗口的对应边界之间。$3$ 条垂直支杆和弹簧的长度之和等于父窗口的高度; $3$ 条水平支杆和弹簧的长度之和等于父窗口的宽度。当父窗口的宽度改变时,所有水平弹簧按照相同比例缩放,使得水平方向的支杆与弹簧的长度之和仍然等于父窗口的宽度。父窗口高度改变时类似。如果 $3$ 根水平/垂直的部件都是支杆,其中最右边/上边的支杆将被替换成弹簧。
给定每个窗口的初始位置和大小(保证恰好有一个顶层窗口包含其他所有窗口),以及所有的支杆和弹簧,你的任务是处理顶层窗口的缩放请求,计算出所有窗口的新大小和位置。
输入格式
输入包含多组数据。每组数据第一行为4个整数 $nwin$, $nresize$, $owidth$, $oheight$,其中 $nwin$ 是指非顶层窗口的个数,$nresize$ 是指缩放请求的个数, $owidth$ 和 $oheight$ 是指顶层窗口的宽度和高度。
接下来的 $nwin$ 行每行包含 $10$ 个非负整数,描述一个非顶层窗口。其中前两个整数表示初始时刻该窗口左上角相对于到父窗口左上角的偏移量。输入保证处理每个缩放请求之后,所有的支杆和弹簧的长度均为正整数,且不同窗口的边界没有公共点。缩放请求不会让一个窗口跑到一个原本和它相离的窗口内部。输入最多有 $100$ 个窗口和 $100$ 个缩放请求,且顶层窗口的宽度和高度不会超过 $1 000000$。输入结束标志为 $4$ 个 $0$。
输出格式
对于每组数据中的每个缩放请求,输出 $nwin$ 行,即每个非顶层窗口的位置 $(x,y)$ 和大小(宽度、高度)。各个窗口应该按照在输入文件中的顺序排列。