題目描述
現在我們在一個平面上畫了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.