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
#include
#include
#include
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; iscanf("%d%d%d%d",&tf[i].x1,&tf[i].y1,&tf[i].x2,&tf[i].y2);
        }
        init();
        for(int i=0; ifor(int j=i+1; jif(tf[i].x1tf[i].y1&&tf[j].x1for(int i=0; iif(f[i]==i)
            {
                sum++;
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

你可能感兴趣的:(SDNU——OJ——1016矩形合并)