1. 程式人生 > >SDNU——OJ——1016矩形合併

SDNU——OJ——1016矩形合併

Description

平面上有n個矩形,給定每個矩形的左下角座標和右上角座標。如果把重合的矩形合併成一個圖形,則經過合併之後,還剩多少個圖形?

Input

第1行:一個整數n(1 <= n <= 100),表示矩形的數量。
第2至第n+1行:每行有4個整數,第i 行中的4個數字分別表示編號為i-1的矩形的左下角x、y座標與右上角x、y座標。

Output

合併後剩餘的圖形數。

Sample Input

3
0 0 2 2
1 1 4 4
4 4 5 5

Sample Output

2

Hint

相鄰不重合的圖形不合並
思路:利用並查集將重合的矩形合併為一個,最後統計一共有多少矩形。
判斷兩個矩形重合的方法:當一個矩形的左下角的座標大於另一個矩形的右上角的座標並且這個矩形左下角的座標小於另一個矩形的右下角的座標,對就是這樣。
AC程式碼:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct
{
    int x1,y1,x2,y2;
} tf[105];
int f[105];
int init()
{
    for(int i=0; i<105; i++)
    {
        f[i]=i;
    }
    return 0;
}
int Find(int v)
{
    if(f[v]==v)
    {
        return
v; } else { f[v]=Find(f[v]); return f[v]; } } int merg(int v,int u) { int t1=Find(v); int t2=Find(u); if(t1!=t2) { f[t2]=t1; } return 0; } int main() { int n; while(scanf("%d",&n)!=EOF) { int sum=0; memset
(f,0,sizeof(f)); memset(tf,0,sizeof(tf)); for(int i=0; i<n; i++) { scanf("%d%d%d%d",&tf[i].x1,&tf[i].y1,&tf[i].x2,&tf[i].y2); } init(); for(int i=0; i<n; i++) { for(int j=i+1; j<n; j++) { if(tf[i].x1<tf[j].x2&&tf[j].y2>tf[i].y1&&tf[j].x1<tf[i].x2&&tf[j].y1<tf[i].y2) merg(i,j); } } for(int i=0; i<n; i++) { if(f[i]==i) { sum++; } } printf("%d\n",sum); } return 0; }