【USACO题库】3.1.4 Shaping Regions形成的区域

题目描述


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

INPUT FORMAT
每行输入的是放置长方形的方法。
第一行输入的是那个放在底的长方形(即白纸)。
第 1 行:A , B 和 N, 由空格分开 (1 <=A, B<=10,000)
第 2 到N+1行:为五个整数 llx, lly, urx, ury, color 这是一个长方形的左下角坐标,右上角坐标和颜色。
颜色 1和底部白纸的颜色相同。

SAMPLE INPUT (file rect1.in) 
20 20 3
2 2 18 18 2
0 8 19 19 3

8 0 10 19 4


OUTPUT FORMAT

输出文件应该包含一个所有能被看到颜色连同该颜色的总面积的清单( 即使颜色的区域不是连续的),按color的增序顺序。不要显示没有区域的颜色。


SAMPLE OUTPUT (file rect1.out)

1 91

2 84

3 187

4 38


这道题目就是矩形切割法:假设当前上面的布已经全部布好了,现在要布的是最最下面的那张白纸,你可以把这张白纸想象成一个可以分解的果冻,每遇到一张布可以往他的上下左右四个方向去分解,而分解的坐标与你当前碰到的这张布的坐标相关。例如如果你当前要分解到这张布的左边,则你分解完之后x1坐标要赋值为(这张布的左边),方便下次计算。(因为左边你已经计算过了,当然无需再计算,也就是把它覆盖,x1坐标更新罢了),其他方向亦然。分解(走完)n个之后就可以计算面积了,这里不一定每个布都要分解,只要当前大布不包含其即可。

代码:

var
        count:array[1..10000]of longint;
        a:array[0..1000,1..5]of longint;
        n,x,y,i:longint;
procedure dfs(x1,y1,x2,y2,tot:longint);
begin
        while ((x1>=a[tot,3]) or (y1>=a[tot,4]) or (x2<=a[tot,1]) or (y2<=a[tot,2])) and (tot<=n) do inc(tot);
        if tot>n then
        begin
                inc(count[a[i,5]],(x2-x1)*(y2-y1));
                exit;
        end;
        if x1<a[tot,1] then                       //go up
	begin
                dfs(x1,y1,a[tot,1],y2,tot+1);
                x1:=a[tot,1];
	end;
        if x2>a[tot,3] then                       //go down
	begin
                dfs(a[tot,3],y1,x2,y2,tot+1);
                x2:=a[tot,3];
        end;
        if y1<a[tot,2] then                       //go left
        begin
                dfs(x1,y1,x2,a[tot,2],tot+1);
                y1:=a[tot,2];
        end;
        if y2>a[tot,4] then                       //go right
        begin
                dfs(x1,a[tot,4],x2,y2,tot+1);
                y2:=a[tot,4];
        end;
end;
begin
        readln(x,y,n);
        for i:=1 to n do
                readln(a[i,1],a[i,2],a[i,3],a[i,4],a[i,5]);
        a[0,1]:=0;
        a[0,2]:=0;
        a[0,3]:=x;
        a[0,4]:=y;
        a[0,5]:=1;
        for i:=0 to n do
                dfs(a[i,1],a[i,2],a[i,3],a[i,4],i+1);
        for i:=1 to 1000 do
                if count[i]>0 then writeln(i,' ',count[i]);
end.

你可能感兴趣的:(【USACO题库】3.1.4 Shaping Regions形成的区域)