【基础算法】【usaco 3.1.4】rect1

问题

描述

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
分析
这就是那天那到“浮水法”的矩形版。思想一样,不再多说,有疑问可以参见我博客上【11月11日的测试】。
但是矩形的思维量就要比线段大的多了。对于矩形来说,两个矩形的关系很复杂,所以,我们的思想就是让当前能穿的继续穿,然后改变矩形的大小,
让剩下的部分继续穿透即可。也就是说对于输入的值,我们要变化。具体的法则自己画个图就明白了,代码也很好理解。
注意题目要求
反思
好多问题都是由简到繁,但是,思想是一致的。这就需要我们能够迁移。能够加强条件。有思想不等于得分。
code
 
{
ID: lxf98092
PROG: rect1
LANG: PASCAL
}
program liukee;
var
  s,color,lx,ly,rx,ry:array[0..10000] of longint;
  m,n,tot,i,max:longint;

procedure cut(x1,y1,x2,y2,t:longint);
begin
//  if t<=tot then
    while(t<=tot)and((x2<=lx[t])or(x1>=rx[t])or(y1>=ry[t])or(y2<=ly[t]))do
      inc(t);
  if t>tot then
  begin
    inc(s[color[i]],abs((x2-x1)*(y2-y1)));
    exit;
  end;
  if (x1<=lx[t])then begin cut(x1,y1,lx[t],y2,t+1); x1:=lx[t];end;
  if (x2>=rx[t])then begin cut(rx[t],y1,x2,y2,t+1); x2:=rx[t];end;
  if (y1<=ly[t])then begin cut(x1,y1,x2,ly[t],t+1); y1:=ly[t];end;
  if (y2>=ry[t])then begin cut(x1,ry[t],x2,y2,t+1); y2:=ry[t];end;
end;

begin
  assign(input,'rect1.in');
  assign(output,'rect1.out');
  reset(input);
  rewrite(output);
  readln(rx[1],ry[1],n);//inc(rx[1]);inc(ry[1]);
  lx[1]:=0;
  ly[1]:=0;
  color[1]:=1;
  max:=1;
  for i:=1 to n do
  begin
    readln(lx[i+1],ly[i+1],rx[i+1],ry[i+1],color[i+1]);
	if max<color[i+1] then max:=color[i+1];
  end;
  tot:=n+1;
  for i:=n+1 downto 1 do
    cut(lx[i],ly[i],rx[i],ry[i],i+1);
   for i:=1 to max do
    if s[i]<>0 then
     writeln(i,' ',s[i]);
  close(input);
  close(output);
end.


 

posted @ 2010-11-14 16:54  liukee  阅读(313)  评论(0编辑  收藏  举报