3.1 Shaping Regions 漂浮法

    技术2022-05-19  20

    描述

    N个不同的颜色的不透明的长方形(1 <= N <= 1000)被放置在一张横宽为A竖长为B的白纸上。这些长方形被放置时,保证了它们的边与白纸的边缘平行。所有的长方形都放置在白纸内,所以我们会看到不同形状的各种颜色。坐标系统的原点(0,0)设在这张白纸的左下角,而坐标轴则平行于边缘。 

     

     格式

    PROGRAM NAME: rect1

    INPUT FORMAT:

    (file rect1.in)

    按顺序输入放置长方形的方法。第一行输入的是那个放在底的长方形(即白纸)。

    第 1 行: A , B 和 N, 由空格分开 (1 <=A, B<=10,000)

    第 2 到N+1行: 为五个整数 llx, lly, urx, ury, color 这是一个长方形的左下角坐标,右上角坐标(x+1,y+1)和颜色。

    颜色 1和底部白纸的颜色相同。 (1 <= color <= 2500)

    OUTPUT FORMAT:

    (file rect1.out)

    输出且仅输出所有能被看到颜色,和该颜色的总面积(可以由若干个不连通的色块组成),按color增序排列。

     

    SAMPLE INPUT

    20 20 3 2 2 18 18 2 0 8 19 19 3 8 0 10 19 4  SAMPLE OUTPUT 1 91 2 84 3 187 4 38  INPUT EXPLANATION

    请注意:被(0,0)和(2,2)所描绘的是2个单位宽、2个单位高的区域

    这里有一个示意图输入:

    11111111111111111111 33333333443333333331 33333333443333333331 33333333443333333331 33333333443333333331 33333333443333333331 33333333443333333331 33333333443333333331 33333333443333333331 33333333443333333331 33333333443333333331 33333333443333333331 11222222442222222211 11222222442222222211 11222222442222222211 11222222442222222211 11222222442222222211 11222222442222222211 11111111441111111111 11111111441111111111

    '4'在(8,0)与(10,19)形成的是宽为2的区域,而不是3.(也就是说,4形成的区域包含(8,0)和(8,1) ,而不是(8,0)和(8,2)) 。

     

    HINTS(谨慎地使用它们!)

    HINT 1

    一个记录所有点的数组太大了;内存最大16MB。

    掌握长方形的坐标动向,当发生覆盖时把长方形分开。

     


    漂浮法

    以逆序来进行放置,即n to 1。逆序的好处在于放置一个矩形后,俯视看到的就是最终俯视该矩形应该看到的。因为挡着它的矩形在之前已经放置好了,所以可直接统计,为递归创造了条件。每放一个矩形,可以想象成将其扔入一密度很大的海水底部,海分成了n层,然后矩形开始向上浮。在上浮过程中若碰撞到其他的矩形则断裂成几个小矩形,继续上浮,直到浮出水面。于是想到用个递归来模拟上浮过程。

     

     


     

    procedure cover(l,r,s,d,k,col:integer); begin while (k<=n) and ((r<=x1[k]) or (l>=x2[k]) or (d<=y1[k]) or (s>=y2[k])) do inc(k); if k>n then begin ans[col]:=ans[col]+(r-l)*(d-s); exit; end; if l<=x1[k] then begin cover(l,x1[k],s,d,k+1,col); l:=x1[k]; end; if r>=x2[k] then begin cover(x2[k],r,s,d,k+1,col); r:=x2[k]; end; if s<=y1[k] then begin cover(l,r,s,y1[k],k+1,col); s:=y1[k]; end; if d>=y2[k] then begin cover(l,r,y2[k],d,k+1,col); d:=y2[k]; end; end;


    最新回复(0)