题目描述
现在我们在一个平面上画了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.新闻热点
疑难解答