您的位置:首页 > 其它

洛谷 P2449 [SDOI2005]矩形

2017-02-21 16:57 288 查看
题目描述

现在我们在一个平面上画了n个矩形。每一个矩形的两边都与坐标轴相平行,且矩形定点的坐标均为整数。现我们定义满足如下性质的图形为一个块:

1.每一个矩形都是一个块;

2.如果两个块有一段公共的部分,那么这两个块就会形成一个新的块,否则这两个块就是不同的。

示例:

图1中的矩形形成了两个不同的块。图2中的矩形形成了一个块。

任务:

请写一个程序:

1.从文本文件PRO.IN中读入各个矩形的顶点坐标;

2.找出这些矩形中不同的块的数目;

3.把结果输出到文本文件PRO.OUT中。

输入输出格式

输入格式:

文本文件PRO.IN的第一行包括一个整数n,1  n  7000,为矩形的数目。以下的n行为矩形顶点的坐标。每一个矩形都是用四个整数来描述的:左下角的x坐标、左下角的y坐标、右上角的x坐标和右上角的y坐标。所有的坐标都是不大于10000的非负整数。

输出格式:

在文本文件PRO.OUT中输出唯一的一个整数——这些矩形所形成的不同的块的数目。

输入输出样例

输入样例#1:

9

0 3 2 6

4 5 5 7

4 2 6 4

2 0 3 2

5 3 6 4

3 2 5 3

1 4 4 7

0 0 1 4

0 0 4 1

输出样例#1:

2

并查集:

1.判断两两矩形是否有重合部分。

2.有就做并查集,合并成一个集合。

3.for一次判断有多少个集合。

时间复杂度:O(n^2)

var
f,x,y,p,q:array [0..7001] of longint;
i,j,n,ans,k,l:longint;

function find(c:longint):longint;
begin
if f[c]=c then exit(c);
f[c]:=find(f[c]);
exit(f[c]);
end;

begin
readln(n);
for i:=1 to n do f[i]:=i;
for i:=1 to n do
begin
readln(x[i],y[i],p[i],q[i]);
for j:=1 to i-1 do
if (p[i]>=x[j]) and (p[j]>=x[i]) and
((q[i]>=y[j]) and (q[j]>=y[i])) and
(((p[i]<>x[j]) and (p[j]<>x[i])) or ((q[i]<>y[j]) and (q[j]<>y[i])))
then if find(i)<>find(j)
then f[find(i)]:=find(j);
end;
for i:=1 to n do
if f[i]=i then inc(ans);
writeln(ans);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: