您的位置:首页 > 其它

Input poj 1262 计算几何

2016-09-03 06:59 141 查看

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”

分析

本题的关键盘是判断是否有交叉覆盖,判断标准如下:
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)
如果答案为true,那就交叉了。


代码

const
maxn=1000;

type
arr=record
x,y:longint;
end;

var
n,m:longint;
l,w:longint;
i,j,k:longint;
left,right:array[1..maxn] of arr;
boom:boolean;
area:longint;

function judge(x,y:longint):boolean;
begin
judge:=true;
if (x<0) or (x>l) or (y<0) or (y>w)
then exit(false);
end;

procedure init;
var
i,j,k:longint;
begin
readln(l,w);
readln(m);
boom:=true;
area:=0;
fillchar(left,sizeof(left),0);
fillchar(right,sizeof(right),0);
for i:=1 to m do
begin
read(left[i].x,left[i].y);
readln(right[i].x,right[i].y);
area:=area+(right[i].x-left[i].x)*(right[i].y-left[i].y);
boom:=judge(left[i].x,left[i].y) and judge(right[i].x,right[i].y);
end;
end;

procedure main;
var
i,j,k:longint;
flag:boolean;
begin
flag:=true;
for i:=1 to m do
for j:=i+1 to m do
if (left[i].x<right[j].x) and (left[j].x<right[i].x) and (left[i].y<right[j].y) and (left[j].y<right[i].y)
then flag:=false;
if not flag
then
begin
writeln('NONDISJOINT');
exit;
end;
if boom=false
then
begin
writeln('NONCONTAINED');
exit;
end;
if area<>l*w
then
begin
writeln('NONCOVERING');
exit;
end;
writeln('OK');
end;

begin
readln(n);
for i:=1 to n do
begin
init;
main;
end;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: