poj 1262 地板覆盖问题

Problem

一个地板被若干砖所覆盖。现在请你判断,这些砖是否恰好不重复,不遗漏的恰好覆盖了整个地板。 

Input

第一行为一个整数N,表示有N组测试数据。 
每组测试数据第一行是两个数l, w,表示地板的长和宽(不超过40000)。 
第二行是一个数t,表示有t块砖(1<=t<=400)。 
下面t行每行是四个数,xl,yl,xh,yh,其中(xl,yl)是砖的左下角坐标,(xh,yh)是砖的右上角坐标。 

Output

每组数据输出包含一行。 
如果输入中砖有交叉覆盖,则输出”NONDISJOINT” 
否则如果有砖超出了地板,则输出”NONCONTAINED” 
否则如果有部分地板没有被覆盖,则输   出”NONCOVERING” 
否则输出”OK” 

题解

本题的关键盘是判断是否有交叉覆盖,判断标准如下:

这里写图片描述
如果不覆盖,C在A的右上角或B在A的左下角即可。
r.left r.right r.up r.down 表示一个矩形r的左边\右边\上边\下边四个判断(r1.left < r2.right) and (r2.left < r1.right) and (r1.up < r2.down) and (r2.up < r1.down)

代码

var
  nm,x,y,n,sum:longint;
  x1,y1,x2,y2,s:array [0..401] of longint;
function max(o,p:longint):longint;
begin
  if o>p then exit(o);
  exit(p);
end;

procedure init;
var
  i,j,l,t,l1,l2:longint;
  f1,f2,f3:boolean;
begin
  for l:=1 to nm do
    begin
      f1:=false; f2:=false; f3:=false;
      sum:=0;
      readln(x,y);
      readln(n);
      t:=max(x,y);
      for i:=1 to n do
        begin
          readln(x1[i],y1[i],x2[i],y2[i]);
          l1:=abs(x1[i]-x2[i]);
          l2:=abs(y1[i]-y2[i]);
          s[i]:=l1*l2;
          sum:=sum+s[i];
          if (x1[i]<0) or (x2[i]<0) or (y1[i]<0) or (y2[i]<0) then f2:=true;
          if (x1[i]>t) or (x2[i]>t) or (y1[i]>t) or (y2[i]>t) then f2:=true;
        end;
      if sum<x*y then f3:=true;
      for i:=1 to n do
        begin
          if f1 then break;
          for j:=i+1 to n do
            if (x1[j]>=x2[i]) or (x2[j]<=x1[i]) or (y1[j]>=y2[i]) or (y2[j]<=y1[i]) then
              continue else
              begin
                f1:=true;
                break;
              end;
        end;
      if f1 then writeln('NONDISJOINT') else
        if f2 then writeln('NONCONTAINED') else
          if f3 then writeln('NONCOVERING') else
            writeln('OK');
    end;
end;

begin
  readln(nm);
  init;
end.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值